Produce a promise which depends on recursive promises

让人想犯罪 __ 提交于 2019-11-27 05:30:20

You use reduce over the array to chain the promises together. There is no need make this recursive.

// for angularjs: var Q = $q.when;
var p = a.reduce(function(prev, el) {
    return prev.then(function(arr) {
        return makeRequest(el).then(function(res) {
             return arr.concat([res]);
         });
    });
}, Q([]));

This is actually a very reasonable request.

The tool we use for this in libraries without a specific .each control is .then:

var a = [1,2,3,4,5];
var p = makeRequest(a.shift()); // use first element
a.forEach(function(el){
    p = p.then(function(result){
        return makeRequest(el);
    });
});

p.then(function(){
    // all requests done
});

Note that I assume you have a makeRequest method here that makes a single request and returns a promise that fulfills when that request is done.

It's also possible to return the results of the requests if you need that using a secondary array:

var a = [1,2,3,4,5];
var results = Array(a.length);
var p = makeRequest(a.shift()).
        then(function(res){ results[0] = res;}); // use first element
a.forEach(function(el,i){
    p = p.then(function(result){
        results[i] = result;
        return makeRequest(el);
    });
});
p = p.thenResolve(results); // resolve with results, in BB that'd be p.return(results)

p.then(function(results){
    // all requests done
    console.log(results); // array of response values
}).catch(function(e){
    // single failure
});

Using the v2 branch of the Bluebird library, you can do:

 Promise.each([1,2,3,4,5],makeRequest).then(function(results){
      // access results
 });
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!