【问题标题】:kriskowal/q node.js q.all and spreadkriskowal/q node.js q.all 和传播
【发布时间】:2013-06-13 01:04:28
【问题描述】:

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

【问题讨论】:

  • 我假设您打算在其中放置一个结束 )

标签: javascript node.js q


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我见过.done() 不带 args 的用法和一些带 args 的例子。有区别和/或最佳做法吗?
    • @Sukima done() 用于显式关闭承诺链,即您不能再期望 then 处理程序在调用 done 之后触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多