javascript - Node.js - 使用 for 循环进行迭代是否可以确保我的回调按顺序依次调用?

标签 javascript node.js

如果标题有点难以描述,我深表歉意 - 但是我经常遇到这个问题,并且想知道处理这种情况的正确方法是什么:

  • 我有一个数组/一些列表,我想迭代并运行调用一些对后续步骤进行回调的方法。所有回调都会被处理吗?他们会按顺序这样做吗:

更具体地说,这是一个示例:

1 - 我创建了这个名为 files 的数组,其中包含文件夹中某些 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消息相继发送?

我希望这个问题有意义。

任何建议表示赞赏。

谢谢。

最佳答案

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

var uploader = client.uploadFile(params);

陆续开始所有上传。它不会等到第一个完成后才开始所有这些。因此,请将您的 for 循环视为启动一大堆异步操作。

然后,一段时间后,您的每一个上传都会完成,不保证顺序。他们基本上都会同时“飞行”。您的每个rabbitMQ操作都会在相应的上传完成时发生。 for 循环此时早已结束,并且 MQ 操作将不按特定顺序排列。

您当前的代码无法判断一切何时完成。

I have an array/some list, I want to iterate through and run call some methods that have callbacks to subsequent steps. Would all the callbacks be processed? And would they be done so in order?

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

Now the bit I'm always unsure of is if I placed the block of code under 2 around a for loop - as that has callbacks inside, are these guaranteed to get called?

是的。您的回调将被调用。 for 启动每个上传,并且在某个时刻,它们都会触发其事件,从而调用您的事件处理程序回调。

In this example I don't really care about the order - however if I did care about the order, will having it in a for loop ensure the uploading and rabbitmq messages are sent one after another?

for 循环将确保按顺序开始上传。但是,无法保证完成顺序,因此您在完成时发送的rabbitmq 消息可能采用任何顺序。如果您希望rabbitmq消息以特定顺序发送或希望上传按顺序排列,那么您需要更多/不同的代码来实现这一点。

关于javascript - Node.js - 使用 for 循环进行迭代是否可以确保我的回调按顺序依次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51700394/

相关文章:

javascript - 如何消除 CSS 中的文本闪烁?

javascript - 在浏览器重新加载/刷新/关闭警报,然后 ajax

javascript - 缩短正则表达式

javascript - 读取 ReadableStream 并指定大小参数 : Why does state. highWaterMark 总是作为大小传递给 ._read()?

node.js - 如何保护 Node 应用程序源代码?

node.js - 具有过滤器和聚合的 Elastic Search 查询不返回聚合

javascript - 从 Node 中不存在的路由重定向?

javascript - Mongoose 如何向模型架构添加一个方法,该方法在每次更新或创建文档时执行?

Javascript/REST/Activiti - 我在 XMLHttpRequest 中做错了什么?

javascript - 在 ExpressJs 中使用 JWT 时出现多个问题