我想做一些非常简单的事情,但我一点都不懂...
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作为Q自述文件的一部分,但未能理解它。
当每个函数的输出作为输入传递给下一个函数时,原始示例使用“瀑布”模型:
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
函数与attribute绑定t
。换句话说,它返回一个新函数,它将调用treat
,t
作为其第一个参数传递。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句