kriskowal/q node.js q.all and spread

kriskowal/q node.js q.all and spread

本文关键字:and spread all node kriskowal js      更新时间:2023-09-26

我有一个函数,它需要传递给它的三个先前承诺的结果。一个是线性相关的,另外两个可以并发运行。我想使用q.all来解析三个promise,然后使用.spread将结果传递给第四个promise。然而,我的代码不工作。如有任何帮助,不胜感激。

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也没有被击中。

Spread在内部调用q.all。

下面是q.js中的spread代码:

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

但是,您的原始调用应该也可以工作。不知道为什么没有

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

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