我想在执行一系列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
中有更好的方法答案 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中没有任何方式可以访问之前的结果。