链接返回promises数组的函数

时间:2015-01-07 15:35:58

标签: javascript node.js promise q

我有类似以下的内容,并想知道是否有一个'链式'这样做的方法,或者如果我没有这个标记,这代表了一种气味。谢谢!

  var promises = Q.all(returns_a_promise()).then(returns_array_of_promises);
  var more_promises = Q.all(promises).then(returns_another_array_of_promises);
  var even_more_promises = Q.all(more_promises).then(yet_another_array_o_promises);

  Q.all(even_more_promises).then(function () {
    logger.info("yea we done");
  });

理想情况如下:

  Q.all(returns_a_promise())
   .then(returns_array_of_promises)
   .all(returns_another_array_of_promises)
   .all(yet_another_array_o_promises)
   .all(function () {
    logger.info("yea we done");
  });

4 个答案:

答案 0 :(得分:6)

直接从函数中返回Q.all,就像这样

Q.all(returns_a_promise())
    .then(function() {
        return Q.all(array_of_promises);
    })
    .then(function() {
        return Q.all(array_of_promises);
    })
    .then(function() {
        return Q.all(array_of_promises);
    })
    .done(function() {
        logger.info("yea we done");
    });

例如,

Q.all([Q(1), Q(2)])
    .spread(function(value1, value2) {
        return Q.all([Q(value1 * 10), Q(value2 * 10)]);
    })
    .spread(function(value1, value2) {
        return Q.all([Q(value1 * 100), Q(value2 * 100)]);
    })
    .spread(function(value1, value2) {
        return Q.all([Q(value1 * 1000), Q(value2 * 1000)]);
    })
    .done(function() {
        console.log(arguments[0]);
    })

会打印

[ 1000000, 2000000 ]

答案 1 :(得分:2)

Q.all(returns_a_promise())
   .then(returns_array_of_promises).all()
   .then(returns_another_array_of_promises).all()
   .then(yet_another_array_o_promises).all()
   .then(function () {
    logger.info("yea we done");
  });

答案 2 :(得分:0)

根据您的承诺的结构,您还可以使用reduce来简化操作:

var promiseGenerators = [
  returns_array_of_promises,
  returns_another_array_of_promises,
  yet_another_array_o_promises
]

promiseGenerators.reduce(function (chain, item) {
  return chain.then(function () {
    // invoke item, which returns the promise array
    return Q.all(item())
  });
}, returns_a_promise())
.done(function () {
  logger.info("yea we done");
})

答案 3 :(得分:0)

以下是等效的:

return Q.all([a, b]);

-

return Q.fcall(function () {
    return [a, b];
})
.all();

https://github.com/kriskowal/q#the-middle