使用forEach在Q中顺序执行函数

时间:2015-08-05 16:00:24

标签: javascript node.js promise q deferred

我尝试使用sequences的第一个策略,根据Q API运行一系列功能。这表明了这种模式:

var funcs = [foo, bar, baz, qux];

var result = Q(initialVal);
funcs.forEach(function (f) {
    result = result.then(f);
});
return result;

阵列中的每个功能都采用什么结构?我对何时使用return def.promise;感到很困惑。那简直就是最后一行吗?是经常还是总是紧跟def.resolve(someVar)。这样的事情会结束吗?

function foo(f){
    var def =  Q.defer();
    f++;
    def.resolve(f);
    return def.promise;
}

这样,数组中的每个后续函数都将接收新计算的f值:在这种情况下,如果var initialVal = 1;和每个递增f++的四个函数,返回的结果将是4?如何访问返回的值? console.log(result)打印{ state: 'pending' }

1 个答案:

答案 0 :(得分:2)

  

阵列中的每个功能都采用什么结构?

Q.js允许以多种方式创建承诺。例如:

function foo(value) {
    var def =  Q.defer();
    def.resolve(value + 1);
    return def.promise;
}

function foo(value) {
    return Q(value + 1);
}

function foo(value) {
    return Q.Promise(function(resolve, reject) {
        resolve(value + 1);
    });
}

其他Promise库类似,但不一定非常灵活。原生js Promises必须使用这些方法中的第三种来构建。

但是,在现实世界中,您很少需要创建自己的Promise。您通常会处理其他人编写的promise-returns lib方法。例如:

function foo(value) {
    return lib.doSomethingAsync(value, and, other, params);
}
  

如何访问返回的值?

如果会员名称"结果"代码更容易理解。被替换为" promise",result.then(f)被一个调用f()的匿名函数重写。

function performAsyncSequence() {
    var promise = Q(initialVal);
    funcs.forEach(function (f) {
        promise = promise.then(function(previousResult) {
            return f(previousResult);
        });
    });
    return promise;
}

这与问题中的代码完全相同,但现在应该更清楚地知道先前的结果是如何沿着承诺链传递的。

在序列中访问所有以前的承诺结果会更复杂。答案here全面讨论了这个问题。