链接返回承诺数组的函数

我有类似于以下内容的东西,想知道是否有一种“链式”的方式来做到这一点,或者如果我不符合标准,这代表了一种气味。 谢谢!

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"); }); 

 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"); }); 

直接从函数返回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 ] 

根据你的承诺的结构,你也可以使用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"); }) 

以下是等同的:

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

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

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