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

Javascript Promise.each中的迭代是否以原子方式执行?,javascript,node.js,bluebird,Javascript,Node.js,Bluebird,我用的是蓝鸟的承诺 假设我试图将图像复制到给定路径,然后删除原始图像。换句话说,剪切和粘贴。我将使用Promise.each对多个图像和多个路径执行此操作 我的问题是:Promise中的每个迭代都是原子运行的吗 假设我正在将第一个图像复制到第一个路径。复制是一个异步函数。下一个副本的下一个迭代是否有可能在第一个副本完成之前开始 通常,在等待第一个I/O完成时,NodeJS是否有可能触发下一个迭代 编辑: 我正在发布一个代码示例。为了使它更简单,我删除了“删除图像”部分,我只是尝试将单个图像复制到

我用的是蓝鸟的承诺

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

我的问题是:Promise中的每个迭代都是原子运行的吗

假设我正在将第一个图像复制到第一个路径。复制是一个异步函数。下一个副本的下一个迭代是否有可能在第一个副本完成之前开始

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

编辑:

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


Promise.each(somePathsArray[],函数(path){
返回副本(simpleImage,path);//异步函数,返回承诺
}).然后(函数(){
console.log('Done');
})

来自:

如果迭代器函数返回一个promise或thenable,那么在继续下一次迭代之前,将等待promise的结果

因此,迭代器函数应该从
copy
返回承诺(或者更可能从链接到
copy
delete
)。如果不这样做,那么下一次迭代将不会等待它。如果你这样做,它会的

例如,接近伪代码:

Promise.each(theArray, entry => doCopy(entry).then(() => doDelete(entry)));
或在ES5中:

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

var路径=[“一”、“二”、“三”];
函数副本(路径){
返回新承诺(函数(解析){
setTimeout(函数(){
日志(“解析”+路径+“承诺”);
解决(路径+“完成”);
}, 500);
});
}
承诺。每个(路径、功能(路径){
console.log(“处理:+path”);
返回副本(路径);
}).然后(函数(){
console.log(“每个都完成了”);
});

请出示您的代码。这实际上取决于您的代码在
Promise.each()
循环中的编写方式,以及您是否正确链接并返回了一个Promise
Promise.each()
将等待您从中返回的承诺,从而序列化操作,但只有当您在循环中的所有操作都链接到您从循环中返回的承诺时,这才起作用。而且,“原子”可能是您问题中的错误词,因为这通常意味着不同的内容。我猜你的意思是“连续”。不,我真的不介意执行顺序是连续的。我想知道迭代中的每一个动作是否都会在下一个动作启动之前执行。@mpoureki:“串行”就是这个意思。这不是“原子”的意思,这就是我正在做的。实际上,我删除了删除部分,我正试图将同一个图像复制到不同的路径,但下一次迭代似乎是在上一次复制完成之前启动的。@mpoureki:“似乎是”?我会证明这是第一步。然后,我将查看您的
copy
函数,以了解它为什么在复制完成之前解析。我不认为Bluebird文档是错误的。@mpoureki:我添加了一个使用Bluebird的示例,证明下一次迭代肯定会等待第一次迭代返回的承诺,然后再继续。对不起,用词不当。当我尝试多次复制同一个图像时,会出现此错误。下一次迭代将在图像仍在复制时启动。我将promisifyAll用于图像处理程序模块,它是fs模块的一个简单包装器。@mpoureki:不管它是什么,它都在您的
copy
函数中,而不是
Promise中。每个
的行为都与所描述的一样。