Javascript承诺内部承诺

时间:2017-11-22 08:42:51

标签: javascript promise

假设我有一个返回值的函数调用,我需要遍历此值并执行另一个返回结果的函数调用。 我需要将所有结果放在一个数组中,并在数组完成后显示数组中的所有值,例如:

var myArray = [];
oneAsyncCall().then(function(val) {
    for (var i = 1; i < val; i++) {
        anotherAsyncCall()().then(function(result) {
            myArray.push(result);
        });
    }
});

当一切都完成后,我应该在哪里做我的foreach迭代myArray?

2 个答案:

答案 0 :(得分:0)

你应该做这样的事情。制作promise数组并使用Promise.all

var myArray = [];
const promiseArray = [];

oneAsyncCall.then(function(val){
    for (var i = 1 ; i < val ; i++) {
        promiseArray.push(anotherAsyncCall()());
    }

    Promise.all(promiseArray)
      .then(function(dataArrayFromPromises){
           //do things with dataArray which is an array of data from promiseArray promises
       });
});

答案 1 :(得分:0)

使用Promise.all。您可以使用ES6 Promise polyfill或bluebird。

oneAsyncCall()
.then(function(val) {
    var promises = [];
    for (var i = 1; i < val; i++) {
        promises.push(anotherAsyncCall()());
    }
    return Promise.all(promises);    
})
.then(function(myArray) {
    // you get all result here
});

此外,我使用以下内容来删除for语句。

Promise.all(
  Array(val-1).fill(undefined).map(() => anotherAsyncCall()())
)

所以它可以改写为

oneAsyncCall()
.then((val) => Promise.all(
   Array(val-1).fill(undefined)
   .map(() => anotherAsyncCall()())
))