Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么node.js脚本永远不会结束?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么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

我在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 < 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();