gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:11:24 25 4
gpt4 key购买 nike

我正在使用 Bluebird promise 。

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

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

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

一般来说,NodeJS 在等待第一个 I/O 完成的同时是否有可能触发下一次迭代?

编辑:

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


Promise.each(somePathsArray[], 函数(路径){
返回副本(简单图像,路径);//异步函数,返回一个 promise
}).then(函数(){
console.log('完成');
})

最佳答案

来自the documentation :

If the iterator function returns a promise or a thenable, then the result of the promise is awaited, before continuing with next iteration.

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

例如,作为近伪代码:

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

或者在 ES5 中:

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");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.4.7/bluebird.min.js"></script>

关于javascript - Promise.each 中的迭代是否以原子方式执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41802474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com