一尘不染

JavaScript如何循环返回多个Promise并等待它们全部做其他事情

javascript

我有一个循环,该循环调用异步完成的方法。该循环可以多次调用该方法。在这个循环之后,我还有另一个循环,只有当所有异步工作都完成后才需要执行。所以这说明了我想要什么:

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);
        });
    });
}

但是我不确定语法。


阅读 1435

收藏
2020-04-25

共1个答案

一尘不染

您可以为此使用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]
2020-04-25