我想做一些非常简单的事情,但我不懂一点......
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
我无法做到这一点:(它应该很简单,我没有抓到一些东西:(
答案 0 :(得分:9)
从你的例子来看,我认为你已经看过Sequences part of Q readme,但却没理解。
使用的原始示例"瀑布" model,当每个函数的输出作为输入传递给下一个函数时:
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
调用的值进行解析(所有先前调用的结果将被忽略)
诀窍是.then
方法接受一个处理程序,它将在解析当前的promise后调用并返回一个新的promise。因此,您应该向.then
传递一个函数,该函数应该在执行链的下一步调用。 treat.bind(null, t)
将treat
函数与属性t
绑定。换句话说,它返回一个新函数,它将调用treat
,并将t
作为其第一个参数传递。