kriskowal / q node.js q.all和spread

时间:2013-06-12 05:41:06

标签: javascript node.js q

我有一个函数需要传递给它的三个先前的promise。一个是线性相关的,另外两个可以同时运行。我想使用q.all来解决三个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):
        }

我可以在node-inspector中跟踪代码,看看是否正在调用前3个promise。但是,.spread调用的函数没有被调用。任何线索为什么?另外.fail也没有被击中。

2 个答案:

答案 0 :(得分:7)

在内部传播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);
}

请注意,它需要一个解析为数组或数组作为第一个参数的promise。

因此,您的通话应如下所示:

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

但是,您的原始通话也应该有效。不知道为什么没有。

答案 1 :(得分:3)

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

var p1 = doWork(data);
var p2 = p1.then(doMoreWork);
var p3 = doConcurrentWork(data);

return Q.spread([p1, p2, p3], funcWith3params)
    .done();

然而,原件是正确的。

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

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();