我有一个循环,该循环调用异步完成的方法。该循环可以多次调用该方法。在这个循环之后,我还有另一个循环,只有当所有异步工作都完成后才需要执行。所以这说明了我想要什么:
for (i = 0; i < 5; i++) { doSomeAsyncStuff(); } for (i = 0; i < 5; i++) { doSomeStuffOnlyWhenTheAsyncStuffIsFinish(); }
我对诺言不太熟悉,所以有人可以帮助我实现诺言吗?
这是我的doSomeAsyncStuff()举止:
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):它接受一堆单独的诺言,并给您返回一个诺言,当您给它的所有诺言都得到解决时,该诺言即被解决;或者当任何一个诺言被拒绝时,它就被拒绝。
Promise.all
因此,如果您做出doSomeAsyncStuff承诺,那么:
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在现实世界中使用它,如先前所示。)
.catch
样本输出(由于,Math.random首先完成的结果可能会有所不同):
Math.random
Resolving 3 Resolving 2 Resolving 1 Resolving 4 Resolving 0 All done [0,1,2,3,4]