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 3

Resolving 2

Resolving 1

Resolving 4

Resolving 0

All done [0,1,2,3,4]

以上是 JavaScript如何循环返回多个Promise并等待它们全部做其他事情 的全部内容, 来源链接: utcz.com/qa/434224.html

回到顶部