更好的方法来解决一个承诺属性的对象?

时间:2015-07-14 23:57:50

标签: javascript node.js promise

我正在创建一个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);
}

1 个答案:

答案 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的方法也是如此。