代码之家  ›  专栏  ›  技术社区  ›  userMod2

js-使用for循环迭代是否确保依次调用我的回调?

  •  0
  • userMod2  · 技术社区  · 7 年前

    抱歉,如果标题有点不规范-但是我经常遇到这个问题,想知道如何正确处理这种情况:

    • 我有一个数组/一些列表,我想遍历并运行call-some方法,这些方法具有对后续步骤的回调。是否会处理所有回调?他们这样做是为了:

    具体来说,这里有一个例子:

    1-我创建了名为“文件”的数组,其中包含文件夹中某些dmg文件的路径:

    var files = []
    
    walker.on('file', function(root, stat, next) {
        if (stat.name.indexOf(".dmg") > -1) {
            files.push(root + '/' + stat.name);
        } 
        next();
    });
    

    2-然后我想遍历,上传一些内容,然后在上传之后向RabbitMQ队列发送一条消息:

    for (var bk = 0; bk < files.length; bk ++) {
    
        var uploader = client.uploadFile(params);
        uploader.on('error', function (err) {
            console.error("unable to upload:", err.stack);
        });
        uploader.on('progress', function () {
            console.log("progress", uploader.progressMd5Amount,
                uploader.progressAmount, uploader.progressTotal);
        });
        uploader.on('end', function () {
            console.log("done uploading");
    
            //Now send the message to RabbitMQ
            myRabbitMQObject.then(function (conn) {
              return conn.createChannel();
            }).then(function (ch) {
              return ch.assertQueue(q).then(function (ok) {
                return ch.sendToQueue(q, new Buffer("Some message with path from the files array"));
            });
            }).catch(console.warn);
    
        });
    
    }
    

    现在我一直不确定的一点是,如果我把for循环周围的代码块放在2之下——因为它内部有回调,这些代码块是否保证会被调用?

    在本例中,我并不真正关心订单,但是如果我确实关心订单,那么让它处于for循环中是否可以确保上传和rabbitmq消息一个接一个地发送?

    我希望这个问题有意义。

    谢谢你的建议。

    谢谢。

    2 回复  |  直到 7 年前
        1
  •  1
  •   jfriend00    7 年前

    你的 for 循环同步运行。在您的代码中,这意味着它将执行以下行:

    var uploader = client.uploadFile(params);
    

    一个接一个地开始上传。它不会等到第一个完成后再开始所有的工作。所以,想想你 对于 循环启动一系列异步操作。

    然后,过一段时间,一个接一个,没有保证的顺序,你的每个上传都会完成。它们基本上都是同时“飞行”的。每当相应的上传完成时,rabbitMQ操作都会发生。这个 对于 循环将很长一段时间后结束,MQ操作将没有特定的顺序。

    你当前的代码无法告诉你什么时候一切都完成了。

    我有一个数组/一些列表,我想遍历并运行call-some方法,这些方法具有对后续步骤的回调。是否会处理所有回调?他们会按顺序这样做吗?

    所有事件都将被触发,并且将调用事件处理程序回调。他们不会以任何有保证的顺序来做。

    现在我一直不确定的一点是,如果我把for循环周围的代码块放在2之下——因为它内部有回调,这些代码块是否保证会被调用?

    对。你的回拨会被呼叫。这个 对于 启动每个上载,在某个时刻,它们都将触发它们的事件,这些事件将调用事件处理程序回调。

    在本例中,我并不真正关心订单,但是如果我确实关心订单,那么让它处于for循环中是否可以确保上传和rabbitmq消息一个接一个地发送?

    这个 对于 循环将确保按顺序启动上载。但是,不能保证完成顺序,因此您在完成时发送的rabbitmq消息可以是任何顺序。如果您希望rabbitmq消息按特定顺序发送,或者希望上传的内容按顺序排列,那么您需要更多/不同的代码来实现这一点。

        2
  •  0
  •   Ramanathan Ganesan    7 年前

    这是我的理解。可能对你有帮助

    • 遍历文件列表并调用上载函数是同步的。它将维持秩序
    • 成功完成上载后更新RabbitMQ并不保证顺序,因为它是异步的,上载的完成取决于上载期间文件的大小和网络延迟。