kriskowal / q node.js q.all和传播

我有一个函数需要传递给它的三个前面的承诺的结果。 一个是线性依赖的,另外两个可以同时运行。 我想用q.all来parsing这三个promise,然后把结果传给第四个使用.spread。 我的代码不起作用。 任何帮助,将不胜感激。

var p1 = doWork(data); var p2 = p1.then(doMoreWork); var p3 = doConcurrentWork(data); return q.all([p1,p2,p3]).spread(funcWith3params) .fail(function(err) { console.log(err): } 

我可以跟踪节点检查器中的代码,看到前3个承诺被调用。 但是,.spread调用的函数没有被调用。 任何线索为什么? 也.fail也没有被打。

在内部传播调用q.all。

这里是从q.js传播的代码:

 Q.spread = spread; function spread(promise, fulfilled, rejected) { return when(promise, function (valuesOrPromises) { return all(valuesOrPromises).then(function (values) { return fulfilled.apply(void 0, values); }, rejected); }, rejected); } 

请注意,它期望作为第一个参数parsing为数组或数组的承诺。

所以你的电话应该是这样的:

 var p1 = doWork(data); var p2 = p1.then(doMoreWork); var p3 = doConcurrentWork(data); return q.spread([p1,p2,p3], funcWith3params, function(err) { console.log(err): }); 

不过,您的原始电话也应该可以工作。 不知道为什么没有。

expression您提供的示例的最简洁的方式是:

 var p1 = doWork(data); var p2 = p1.then(doMoreWork); var p3 = doConcurrentWork(data); return Q.spread([p1, p2, p3], funcWith3params) .done(); 

但是,原文正确无误。

我怀疑问题是一个或多个input的承诺永远不能解决。 尝试使用超时来隔离问题。

 var p1 = doWork(data).timeout(1000, 'p1 timed out'); var p2 = p1.then(doMoreWork).timeout(1000, 'p2 timed out'); var p3 = doConcurrentWork(data).timeout(1000, 'p3 timed out'); return Q.spread([p1, p2, p3], funcWith3params) .done();