gpt4 book ai didi

javascript - 使用 node.js + Q deferred/promises 模块从同步回调创建同步循环

转载 作者:搜寻专家 更新时间:2023-10-31 23:06:20 25 4
gpt4 key购买 nike

流行的 JavaScript 模块 Q实现延期/ promise / future 概念。我认为它主要与 node.js 一起使用,但它也支持浏览器使用。我将它与 node.js 一起使用。

要进行顺序调用,您可以使用 then() 将一个 promise 链接到下一个 promise ,但在循环中它可能违反直觉,我发现很难像这个伪代码那样做:

forever {
l = getline();

if (l === undefined) {
break;
} else {
doStuff(l);
}
}

Q 文档包含一个看起来非常相似的示例:

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

var result = Q.resolve(initialVal);
funcs.forEach(function (f) {
result = result.then(f);
});
return result;

但在尝试多种方法来使这个示例适应我的问题时,我完全没有成功。

与示例代码不同,我没有遍历数组,而是希望循环直到满足结束条件。我也总是调用相同的函数。我的函数不会将先前的结果作为下一次调用的参数。每次调用都不带参数,但返回值决定是否继续循环。

这些看似微不足道的差异正在造成某种难以逾越的心理障碍。现在我明白了为什么很多人难以理解 promise。

最佳答案

要记住的关键是,如果您从 then 回调中返回一个 promise,那么它将替换现有的 promise。这个想法是,在循环体中执行任何你想做的事情链的一次迭代之后,你要么返回一个值,这将解决 promise ,要么返回一个新的 promise ,它将再次执行循环体。

function iterateUntil(endValue){
// This line would eventually resolve the promise with something matching
// the final ending condition.
return Q.resolve('some value')
.then(function(value){
// If the promise was resolved with the loop end condition then you just
// return the value or something, which will resolve the promise.
if (value == endValue) return value;

// Otherwise you call 'iterateUntil' again which will replace the current
// promise with a new one that will do another iteration.
else return iterateUntil(endValue);
});
}

关于javascript - 使用 node.js + Q deferred/promises 模块从同步回调创建同步循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14916968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com