Promise.each中的迭代是否以原子方式执行?

时间:2017-01-23 09:03:29

标签: javascript node.js bluebird

我使用蓝鸟的承诺。

让我们说我试图将图像复制到给定路径,然后删除原始图像。换句话说,剪切和粘贴。我将使用Promise.each为多个图像和多个路径执行此操作。

我的问题是:Promise.each循环中的每次迭代都是以原子方式运行的吗?

让我们说我将第一张图片复制到第一条路径。复制是一个异步功能。下一个副本的下一次迭代是否有可能在第一个副本完成之前开始?

通常,NodeJS是否有可能在等待第一个I / O完成时触发下一次迭代?

编辑:

我发布了一个代码示例。为了使它更简单,我删除了"删除图像"部分,我只想尝试将单个图像复制到多个路径。

Promise.each(somePathsArray[], function(path){ return copy(simpleImage, path); // async function, returns a promise }).then(function(){ console.log('Done'); })

1 个答案:

答案 0 :(得分:1)

来自the documentation

  

如果迭代器函数返回promise或者thenable,那么等待promise的结果,然后再继续下一次迭代。

所以你的迭代器函数应该从copy(或者更可能从链接到delete的{​​{1}}返回承诺。如果你没有这样做,那么下一次迭代就不会等待它。如果你这样做,它会。

,例如近伪代码:

copy

或者在ES5中:

Promise.each(theArray, entry => doCopy(entry).then(() => doDelete(entry)));

证明:



Promise.each(theArray, function(entry) {
    return doCopy(entry).then(function() {
        return doDelete(entry);
    });
});

var paths = ["one", "two", "three"];
function copy(path) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      console.log("Resolving " + path + " promise");
      resolve(path + " done");
    }, 500);
  });
}
Promise.each(paths, function(path) {
  console.log("Processing: " + path);
  return copy(path);
}).then(function() {
  console.log("each is done");
});