【问题标题】:Nodejs / Q : Chaining promises sequentiallyNodejs / Q:顺序链接承诺
【发布时间】:2015-02-04 01:01:17
【问题描述】:

我想做一些很简单的事情,但是我一点都不懂……

var Q = require('q');

var funcs = ["first", "second", "third", "fourth"];

function main(){

// really don't know how to chain sequentially here ...
    var result = Q();

    funcs.forEach(function (f) {
        result = treat(f).then(f);
    });

}

function treat(t){

    var deferred = Q.defer();

    setTimeout(function(){
        deferred.resolve("treated "+ t); 
    },2000);

    return deferred.promise;
}

main();

我希望我的 funcs 数组的每个元素都按顺序“处理”,然后输出将类似于:

treated first
//2 seconds later
treated second
//2 seconds later
treated third
//2 seconds later
treated fourth

我无法做到这一点:(它应该很简单,我没有抓住任何东西:(

【问题讨论】:

    标签: node.js promise sequence q chain


    【解决方案1】:

    从你的例子来看,我假设你已经看过Sequences part of Q readme,但没看懂。

    原始示例使用“瀑布”模型,当每个函数的输出作为输入传递给下一个时:

    var funcs = [foo, bar, baz, qux];
    
    var result = Q(initialVal);
    funcs.forEach(function (f) {
        result = result.then(f);
    });
    return result;
    

    但是您只想按顺序执行我们所有的函数,因此您可以简单地将每个函数与其变量绑定:

    var args = ["first", "second", "third", "fourth"];
    
    var result = Q();
    args.forEach(function (t) {
        result = result.then(treat.bind(null, t));
    });
    return result;
    

    在我的示例中,treat 函数将被依次调用 4 次,result 承诺将使用最新的 treat 调用的值来解析(所有先前调用的结果将被忽略)。

    诀窍在于.then 方法接受一个处理程序,该处理程序将在当前承诺解决后调用并返回一个新承诺。因此,您应该将一个函数传递给.then,该函数应在执行链的下一步调用。 treat.bind(null, t)treat 函数与属性 t 绑定。换句话说,它返回一个新函数,该函数将调用treat,并将t 作为其第一个参数。

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多