Javascript 为什么node.js脚本永远不会结束?
我在node.js中有以下脚本:Javascript 为什么node.js脚本永远不会结束?,javascript,node.js,Javascript,Node.js,我在node.js中有以下脚本: var db = require("redis"); var dbclient = db.createClient(); function doSomeUpload() dbclient.zrangs("noper", 0, 5000, function (err, replies){ var lengthNum = replies.length; for (var i=0; i < repl
var db = require("redis");
var dbclient = db.createClient();
function doSomeUpload()
dbclient.zrangs("noper", 0, 5000, function (err, replies){
var lengthNum = replies.length;
for (var i=0; i < replies.length; i++){
// Upload the file with s3 client
uploader.on('end', function();
lengthNum--;
if (lengthNum == 0){
console.log("Done!")
return;
}
})
})
doSomeUpload()
var db=require(“redis”);
var dbclient=db.createClient();
函数doSomeUpload()
dbclient.zrangs(“noper”,0,5000,函数(err,responses){
var lengthNum=replements.length;
for(var i=0;i
运行此脚本时:节点scriptupload.js
,完成代码>已打印,但脚本永不结束。它仍然在运行,我必须执行ctrl+c
才能结束node.js进程
为什么它永远不会结束(即使函数返回..)您需要减少计数器而不是增加计数器,否则它将永远不会小于回答。长度:
for (var i=replies.length; i > 0; i--){
// Upload the file with s3 client
uploader.on('end', function();
// lengthNum--; // You don't need this anymore
if (i == 0){
console.log("Done!")
return;
}
})
问候语您的循环非常笨拙,您应该减少一个计数器,然后首先用回复。长度
初始化它。否则很容易得到一个无限循环
for循环的最后一行也有一个错误,您将一个空回调传递给上传程序的end
事件。
您还遗漏了几个分号(这是可选的,但要让程序清楚)
我会放一个console.log(“Returned”)代码>在脚本的末尾。应该调用它,但可能有一个S3上传挂起
除此之外,还有一个语法错误:
在第3行(缺少左大括号{,相应的右大括号有一个右大括号),它不应该这样做)
在第9行(分号;代替左大括号{和右大括号)
for循环缺少右大括号
调用dbclient.zrangs后缺少分号;
对uploader.on的调用缺少分号;(可能不是必需的,但会使事情复杂化,多数Node.js风格主张使用它们)
调用doSomeUpload()后缺少分号;
存在语义错误或不必要的代码:
uploader.on()回调中的返回将从该回调返回,而不会中断for循环或从doSomeUpload()返回
下面是经过一些简化、命名增强和错误处理的更正代码:
var db = require("redis");
var dbclient = db.createClient();
function doSomeUpload(){
dbclient.zrangs("noper", 0, 5000, function(err, replies){
if (err){
console.error(err);
} else {
var uploadsRemaining = replies.length;
replies.forEach(function(reply){
// Upload the file with s3 client
uploader.on('end', function() {
uploadsRemaining--;
if (uploadsRemaining == 0){
console.log("Done!");
}
});
});
}
});
}
doSomeUpload();
我认为错误在于代码中没有共享。S3上传可能会被阻塞,这很容易通过设置一个低超时(比如10秒)来验证
使用JSLint或构建它的编辑器或类似的东西是非常值得的(Emacs和WebStorm都这样做):
在提交到在线工具之前,请确保清除代码(删除凭据或IP敏感代码)。最好下载该工具并在本地运行,或者使用带有JavaScript代码检查的编辑器
在生产环境中,您的代码应该没有错误或警告。这样做会大大限制混淆运行时行为的空间。I减少它。函数返回。它打印完成的单词。不,您减少lengthNum
,而不是您的计数器变量I
,但如果我这样做,那么我将是负数。在我看来i
可以替换为lengthNum
-您只需要其中一个them@Zorgatone我提供了一个答案,并正在编写一个答案,当时我否决了这些不正确的答案。请删除此评论。for(I=0;i0;I--)
它只是接收与此无关的索引顺序。请参见他忘记关闭回调函数的部分。我想我现在已经捕获了所有语法错误。我的sybtax固定代码版本看起来合理吗?我可以删除下一票,但您需要删除关于递减循环与递增循环的值判断H既不正确也不具有建设性。我在这里犯了一个大错误。我没有考虑你所提供的另一个语法修正,这使得循环错误是正确的。人们的下注是什么?提供评论或不投票。这是新社区成员特别糟糕的行为。在提供的代码中,不清楚使用了哪些库。拥有SSCCE会非常有帮助。你能提供SSCCE吗?我知道你不能包含AWS访问密钥或AWS秘密访问密钥。如果你不允许AWS节点SDK默认从~/.AWS/credentials加载它们,只需为它们输入空白字符串。你应该接受a如果我们提供了答案,请回答。在这些答案中做了大量工作;)@中间件这能解决您的问题吗?帮助我的是将返回替换为:process.exit()。
var db = require("redis");
var dbclient = db.createClient();
function doSomeUpload(){
dbclient.zrangs("noper", 0, 5000, function(err, replies){
if (err){
console.error(err);
} else {
var uploadsRemaining = replies.length;
replies.forEach(function(reply){
// Upload the file with s3 client
uploader.on('end', function() {
uploadsRemaining--;
if (uploadsRemaining == 0){
console.log("Done!");
}
});
});
}
});
}
doSomeUpload();