Javascript 使用forEach顺序执行Q中的函数

Javascript 使用forEach顺序执行Q中的函数,javascript,node.js,promise,q,deferred,Javascript,Node.js,Promise,Q,Deferred,我正在尝试运行一系列基于QAPI的函数,使用它们的第一个策略。这表明了一种模式: var funcs = [foo, bar, baz, qux]; var result = Q(initialVal); funcs.forEach(function (f) { result = result.then(f); }); return result; 数组中的每个函数的结构是什么?我很困惑何时使用return def.promise。这就是最后一行吗?它是否经常或总是立即跟随定义解析(

我正在尝试运行一系列基于
Q
API的函数,使用它们的第一个策略。这表明了一种模式:

var funcs = [foo, bar, baz, qux];

var result = Q(initialVal);
funcs.forEach(function (f) {
    result = result.then(f);
});
return result;
数组中的每个函数的结构是什么?我很困惑何时使用
return def.promise。这就是最后一行吗?它是否经常或总是立即跟随定义解析(someVar)
。是这样的结构吗

function foo(f){
    var def =  Q.defer();
    f++;
    def.resolve(f);
    return def.promise;
}
因此,数组中的每个后续函数将接收新计算的
f
:在这种情况下,如果
var initialVal=1
和四个函数,每个函数递增
f++
,返回的结果将是
4
?如何访问该返回值
console.log(结果)
打印
{state:'pending'}

数组中的每个函数的结构是什么

js允许通过多种方式创建承诺。例如:

function foo(value) {
    var def =  Q.defer();
    def.resolve(value + 1);
    return def.promise;
}

function foo(value) {
    return Q(value + 1);
}

function foo(value) {
    return Q.Promise(function(resolve, reject) {
        resolve(value + 1);
    });
}
function foo(value) {
    return lib.doSomethingAsync(value, and, other, params);
}
其他Promise LIB类似,但不一定如此灵活。原生js承诺必须使用这些方法中的第三种来构建

然而,在现实世界中,你很少需要创造自己的承诺。您通常会处理其他人编写的承诺返回lib方法。例如:

function foo(value) {
    var def =  Q.defer();
    def.resolve(value + 1);
    return def.promise;
}

function foo(value) {
    return Q(value + 1);
}

function foo(value) {
    return Q.Promise(function(resolve, reject) {
        resolve(value + 1);
    });
}
function foo(value) {
    return lib.doSomethingAsync(value, and, other, params);
}
如何访问该返回值

如果将成员名“result”替换为“promise”,并使用调用
f()
的匿名函数重写(f),则代码更容易理解

这与问题中的代码是100%等价的,但现在应该更清楚之前的结果是如何沿着承诺链传递的


访问序列中所有以前的promise结果更加复杂。答案全面地讨论了这个问题。

如果您愿意,可以尝试几天前我写的一些代码。你可以在电视上找到它。遗憾的是,我还没有在github上发布经过审查的版本。但是,如果你感兴趣的话,我今天可以做。基本上,将函数添加到一个队列中,该队列按顺序执行函数。它需要以毫秒为单位的延迟,但可以运行的函数数量是无限的。还是我误解了这个问题?@IsmaelMiguel,非常感谢。不,你没有误解这个问题。然而,这对于我的需求来说有点复杂,因为我只是从最基本的方面来了解这一点。我更想知道如何使用队列中已知数量的函数来实现这一点,这样我最终可以提高复杂性。不过非常感谢你。我已经为你的函数添加了书签:)很抱歉,但我不明白这一点:“我更想知道如何使用队列中已知数量的函数来实现这一点”。可能缺少一个单词。@IsmaelMiguel如果队列中的函数数已知,该如何做。@IsmaelMiguel“…如何做…”;)