【问题标题】:Using forEach to sequentially execute functions in Q使用 forEach 顺序执行 Q 中的函数
【发布时间】:2015-10-28 12:27:55
【问题描述】:

我正在尝试使用他们针对sequences 的第一个策略来运行基于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; 感到很困惑。那总是最后一行吗?它会经常还是总是立即关注def.resolve(someVar)。像这样的结构是这样的吗?

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

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

【问题讨论】:

  • 如果你愿意,你可以试试我前几天写的一些代码。您可以在codereview.stackexchange.com/questions/98134/… 上找到它。遗憾的是,我还没有在 github 上发布经过审查的版本。但是,如果你有兴趣,我今天可以做。基本上,您将函数添加到按顺序执行它们的队列中。它需要以毫秒为单位的延迟,但您可以运行的函数数量是无限的。还是我误解了这个问题?
  • @IsmaelMiguel 非常感谢。不,你没有误解这个问题。但是,这对于我的需求来说有点复杂,因为我只是以最基本的方式学习这一点。我更多的是寻找如何使用队列中已知数量的函数来实现这一点,因此我最终可以发展到更高级别的复杂性。不过非常感谢。我已经为你的函数添加了书签:)
  • 对不起,但我不明白这一点:“我更多的是寻找如何使用队列中已知数量的函数来实现这一点”。可能少了一个字。
  • @IsmaelMiguel 如果知道队列中的函数数量怎么办。
  • @IsmaelMiguel "...如何这个..." ;)

标签: javascript node.js promise q deferred


【解决方案1】:

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

Q.js 允许以多种方式创建 Promise。例如:

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);
    });
}

其他 Promise 库类似,但不一定那么灵活。 Native js Promises 必须使用这些方法中的第三种来构造。

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

function foo(value) {
    return lib.doSomethingAsync(value, and, other, params);
}

如何访问该返回值?

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

function performAsyncSequence() {
    var promise = Q(initialVal);
    funcs.forEach(function (f) {
        promise = promise.then(function(previousResult) {
            return f(previousResult);
        });
    });
    return promise;
}

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

访问 all 序列中的先前承诺结果更加复杂。答案here全面讨论了这个话题。

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2013-09-26
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多