Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodejs/Q:按顺序链接承诺_Node.js_Promise_Sequence_Q_Chain - Fatal编程技术网

Node.js Nodejs/Q:按顺序链接承诺

Node.js Nodejs/Q:按顺序链接承诺,node.js,promise,sequence,q,chain,Node.js,Promise,Sequence,Q,Chain,我想做一些非常简单的事情,但我一点都不懂 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(

我想做一些非常简单的事情,但我一点都不懂

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

我没法做到:(应该很简单,我没听懂什么:(

从你的例子来看,我假设你已经看到了,但没有理解它

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

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
promise将使用最新的
treat
call值进行解析(之前所有调用的结果将被忽略)

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