JavaScript如何循环返回多个Promise并等待它们全部做其他事情
我有一个循环,该循环调用异步完成的方法。该循环可以多次调用该方法。在这个循环之后,我还有另一个循环,只有当所有异步工作都完成后才需要执行。所以这说明了我想要什么:
for (i = 0; i < 5; i++) { doSomeAsyncStuff();
}
for (i = 0; i < 5; i++) {
doSomeStuffOnlyWhenTheAsyncStuffIsFinish();
}
我对诺言不太熟悉,所以有人可以帮助我实现诺言吗?
这是我的doSomeAsyncStuff()
举止:
function doSomeAsyncStuff() { var editor = generateCKEditor();
editor.on('instanceReady', function(evt) {
doSomeStuff();
// There should be the resolve() of the promises I think.
})
}
也许我必须做这样的事情:
function doSomeAsyncStuff() { var editor = generateCKEditor();
return new Promise(function(resolve,refuse) {
editor.on('instanceReady', function(evt) {
doSomeStuff();
resolve(true);
});
});
}
但是我不确定语法。
回答:
您可以为此使用Promise.all
(spec,MDN):它接受一堆单独的诺言,并给您返回一个诺言,当您给它的所有诺言都得到解决时,该诺言即被解决;或者当任何一个诺言被拒绝时,它就被拒绝。
因此,如果您做出doSomeAsyncStuff
承诺,那么:
var promises = [];for(i=0;i<5;i+){
promises.push(doSomeAsyncStuff());
}
Promise.all(promises)
.then(() => {
for(i=0;i<5;i+){
doSomeStuffOnlyWhenTheAsyncStuffIsFinish();
}
})
.catch((e) => {
// handle errors here
});
function doSomethingAsync(value) {
return new Promise((resolve) => {
setTimeout(() => {
console.log("Resolving " + value);
resolve(value);
}, Math.floor(Math.random() * 1000));
});
}
function test() {
let i;
let promises = [];
for (i = 0; i < 5; ++i) {
promises.push(doSomethingAsync(i));
}
Promise.all(promises)
.then((results) => {
console.log("All done", results);
})
.catch((e) => {
// Handle errors here
});
}
test();
(对此.catch
您一点也不在意,但是您确实想要.catch
在现实世界中使用它,如先前所示。)
样本输出(由于,Math.random
首先完成的结果可能会有所不同):
Resolving 3Resolving 2
Resolving 1
Resolving 4
Resolving 0
All done [0,1,2,3,4]
以上是 JavaScript如何循环返回多个Promise并等待它们全部做其他事情 的全部内容, 来源链接: utcz.com/qa/434224.html