我使用蓝鸟的承诺。
让我们说我试图将图像复制到给定路径,然后删除原始图像。换句话说,剪切和粘贴。我将使用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');
})
答案 0 :(得分:1)
如果迭代器函数返回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");
});