node.js – Nodejs/Q:顺序链接promises

我想做一些非常简单的事,但我不明白一点……

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作为其第一个参数传递.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...