流行的 JavaScript 模块Q实现了延迟/承诺/期货概念。我认为它主要与 node.js 一起使用,但它也支持浏览器使用。我将它与 node.js 一起使用。
要进行顺序调用,您将一个承诺链接到下一个使用then()
,但在一个循环中,它可能非常违反直觉,我发现很难像这个伪代码一样做同样的事情:
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;
但是在尝试多种方法来使这个例子适应我的问题时,我根本没有成功。
与示例代码不同,我不是遍历数组而是希望循环直到满足结束条件。我也总是调用相同的函数。我的函数不会将先前的结果作为下一次调用的参数。每个调用都没有参数,但返回值决定是否继续循环。
这些看似微不足道的差异,却造成了某种难以逾越的心理障碍。现在我明白为什么很多人难以理解承诺了。