我正在创建一个json对象作为node.js服务中的响应;并且它的一些字段是异步计算的并包含在promises中。
在解决所有属性后,是否有任何优雅的方法来组成一个已解决的promise? (而不是明确地对值进行all
并替换它们。)
所以不要做类似的事情:
function calculateResponse() {
var obj = {
a : somePromise(),
b : someOtherPromise()
};
return q.all([obj.a, obj.b]).then(function(results) {
obj.a = results[0];
obj.b = results[1];
return obj;
});
}
最好有类似的东西:
function calculateResponse() {
var obj = {
a : somePromise(),
b : someOtherPromise()
};
return q.allFields(obj);
}
答案 0 :(得分:1)
这就是我现在正在做的事情,以防万一没有人提出更好的解决方案:
var allAttributesResolved = function(obj) {
var pairs = _(obj).pairs().unzip().value();
var keys = pairs[0];
var values = pairs[1];
return q.all(values).then(function(results) {
return _.zipObject(keys, results);
});
};
如果使用bluebird
而不是q
,则会有一个名为props
的方法也是如此。