我想做一些很简单的事情,但是我一点也不明白…

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

我做不到:(应该很简单,我不明白什么:)(

最佳答案

从你的例子来看,我认为你已经看到了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次,resultpromise将用最新的treat调用值解析(所有先前调用的结果都将被忽略)。
诀窍是.then方法接受一个处理程序,该处理程序将在当前承诺被解析并返回一个新承诺后调用。因此,您应该向.then传递一个函数,该函数应该在执行链的下一步调用。treat.bind(null, t)treat函数与属性t绑定。换句话说,它返回一个新函数,该函数将调用treat,并将t作为其第一个参数传递。

关于node.js - Node.js/Q:链式 promise 依序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27322994/

10-09 18:13