【问题标题】:Await promises in async loop在异步循环中等待承诺
【发布时间】:2018-07-12 13:14:39
【问题描述】:

为什么这段代码 sn -p 没有按预期工作,以至于在对象填充数据之前调用了console.debug(images)?我希望这两个循环并行运行,但await Promise.all 应该等待循环完成。第一个循环和第二个循环应该同时运行。

const images = {
     taskImages: [],
     solutionImages: []
};

await Promise.all(Object.keys(files).map((key) => {
    files[key].map(async (file) => {
        const fileId = getFileId(file.path);
        const result = await storeImage(fileId, file.path);
        if (result) {
            images[key].push(fileId);
            console.debug("Pushed " + key);
        }
    });
}));

console.debug(images);

【问题讨论】:

  • 您必须在变量上定义等待。 const promises = await Promise.all([]);
  • @Baruch 我不这么认为。

标签: javascript node.js loops promise


【解决方案1】:

外部.map() 调用中的函数不返回任何内容,因此Promise.all 没有得到任何等待的承诺。

解决方案就是将内部map() 包裹在Promise.all(...) 中并返回:

await Promise.all(Object.keys(files).map((key) => {
    return Promise.all(files[key].map(async (file) => {...}));
}));

【讨论】:

  • 它可以工作,但这是否意味着外循环等待内循环完成?我希望外循环启动内循环并继续。所以每个循环动作都应该在自己的“线程”中运行。
  • @Twister21 只有await 会停止函数的执行。 Promise.all 只是返回一个新的 Promise,它收集了你给它的所有 Promise。
  • @Twister21 - 只有一个 Javascript“线程”,因此考虑在其自己的线程中运行的循环的每次调用并不是一个好方法。await 暂停执行async 函数,直到 promise 解决,然后在等待该 promise 解决时让其他事件得到处理,以便它可以继续执行该函数。当该承诺解决时,它必须重新回到事件队列中,并等待当时正在运行的其他任何东西完成,然后再轮到它继续执行该功能。
【解决方案2】:

简单的解决方案一:

解决方案 2:

你也可以使用

npm 异步库

Link

async.parallel({
    one: function(callback) {
        setTimeout(function() {
            callback(null, 1);
        }, 200);
    },
    two: function(callback) {
        setTimeout(function() {
            callback(null, 2);
        }, 100);
    }
}, function(err, results) {
    // results is now equals to: {one: 1, two: 2}
});

【讨论】:

  • 既然有本地解决方案可以做同样的事情,为什么还要使用像异步库这样过时的第三方解决方案?
  • 代码应该以文本的形式发布,并以代码的格式正确地发布,而不是图像。图片不能被搜索,不能被复制和粘贴,等等......并且比正确格式化的文本有用得多。
  • 我同意埃斯图斯。 Promise 是用于管理异步操作的 Javascript 的现在和未来,而不是 Async 库。我们应该只教新手 promise,awaitasync,而不是被 Async 库覆盖的传统回调。
猜你喜欢
  • 2017-06-15
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 2017-12-16
相关资源
最近更新 更多