Javascript、节点、Promises 和递归

Javascript, Node, Promises, and recursion

我无法控制执行流程。这是 and node.js table search fails with promises in use 的后续。从 console.log 打印输出来看,我的递归例程工作得很好,除了第一次调用 resolve() (第 n 次递归调用的信号)为后续代码开了绿灯,不应该得到它绿灯,直到第一次调用递归例程调用 resolve()。事实证明,对递归例程的第一次调用提供了我想要报告的答案,但是当它报告它时,后续代码不再监听它并且 运行 幸福地与 "undefined" 回答。不好。

我的代码太长了,不能在这里分享。我试着写了一个问题的小模型,但还没有找到复制行为的因素组合。

听起来很熟悉?您如何正确控制 Promises 按时发布后续代码?

我想也许对例程的第一次调用可以启动一个传递给 Promise.all 的数组,以后的调用会向该数组添加另一个条目。我没试过。疯了吗?

没有看到您的实际代码,我们无法具体回答。

Sound familiar? How do you keep proper control over Promises releasing follow-on code on time?

答案始终是在您准备好要执行的事情之前不要解决链中的第一个承诺,并构建您的承诺链,以便在它们正在等待的事情发生之前不会执行相关的事情得到妥善解决。如果某些东西执行得太快,那么你要么调用得太快,要么你的 promise 结构不正确。没有看到您的实际代码,我们无法确定。

一个常见的错误是:

someAsyncOperation().then(someOtherAync()).then(...)

应该是:

someAsyncOperation().then(someOtherAync).then(...)

您应该在其中传递对下一个异步函数的引用,而不是立即调用它并传递其 return 值。

I thought maybe the first call to the routine could start an array passed into a Promise.all and later calls would add another entry to that array. I haven't tried it. Crazy?

您不能将一个数组传递给 Promise.all(),然后再向该数组添加内容 - 这不是 Promise.all() 支持的功能。您可以将后续的事情链接到 Promise.all() 的结果上,或者做另一个 Promise.all(),其中包括前一个 Promise.all() 的承诺和更多的承诺。

var someArrayOfPromises = [...];
var pAll = Promise.all(someArrayOfPromises);

var someMorePromises = [...]
someMorePromises.push(pAll);
Promise.all(someMorePromoises).then(...)