8

我有一个函数需要传递给它的三个先前承诺的结果。一个是线性相关的,另外两个可以同时运行。我想使用 q.all 来解决三个承诺,然后使用 .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 也没有被击中。

4

2 回答 2

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

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

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

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

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

于 2013-06-12T14:34:19.053 回答
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();
于 2013-06-12T17:01:23.513 回答