保持一系列Q.all承诺的清晰方式

时间:2014-03-20 13:39:07

标签: javascript asynchronous functional-programming promise q

我想在执行一系列Q.all任务时保留一组中间结果。

具体问题如下:

var Obj = function(first, second) { 
    return { 
        stuff: first, 
        otherStuff: [1,2],
        nextStuff: function() { return Q.fcall(function() { return second }) }
    }
};                                     

var ab = Q.fcall(function() { return Obj("A", "B"); });
var cd = Q.fcall(function() { return Obj("C", "D"); });

var promises = [ab, cd];

我想要的是[{stuff: obj, nextStuff: "B"}, {stuff: obj, nextStuff: "D"}]

的结果

现在我保留对前一个结果的引用,并使用像

这样的underscore.js映射它们
Q.all(promises).then(function(stuffs) { 
    var promiseNextStuff = _.map(stuffs, function(x) { return x.nextStuff(); });
    Q.all(promiseNextStuff).then(function(nextStuffs) { 
        var result = _.map(_.zip(stuffs, nextStuffs), function(obj) { 
            return _.object(["stuff", "nextStuff"], obj); 
        });
        console.log("result", result);
    });
});

...但我确信在Q

中有更好的方法

http://jsfiddle.net/joelkuiper/xY8Ew/2/

1 个答案:

答案 0 :(得分:1)

在将结果转换回对象之前,我不会等待所有承诺(或所有nextStuffPromises):

Q.all(_.invoke(promises, "then", function(obj) {
// or:_.map(promises, function(p) { return p.then(function(obj) {
    return obj.nextStuff().then(function(nextStuff) {
        return {
            prevStuff: obj,
            nextStuff: nextStuff
        };
    }); // });
})).then(console.log.bind(console, "result:"));

除了嵌套then来电之外,Q中没有任何方式可以访问之前的结果。