我想做一些非常简单的事,但我不明白一点……
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","fourth"]; var result = Q(); args.forEach(function (t) { result = result.then(treat.bind(null,t)); }); return result;
在我的示例中,treat函数将按顺序调用4次,结果promise将使用最新的treat调用值解析(所有先前调用的结果将被忽略).
诀窍是.then方法接受一个处理程序,该处理程序将在解析当前promise后调用并返回一个新的promise.所以,你应该传递给.then一个应该在你的执行链的下一步调用的函数. treat.bind(null,t)将treat函数与属性t绑定.换句话说,它返回一个新函数,它将调用treat,将t作为其第一个参数传递.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。