Javascript,Node,Promises和递归

时间:2015-12-16 17:58:40

标签: javascript node.js recursion bluebird

我无法控制执行流程。这是node.js, bluebird, poor control of execution pathnode.js table search fails with promises in use的后续内容。从console.log打印输出来看,我的递归例程工作得很好,除了第一次调用resolve()(第n次递归调用的信号)给后续代码提供了绿灯,不应该得到那个绿灯直到第一次调用递归例程调用resolve()。事实证明,对递归例程的第一次调用提供了我想要报告的答案,但是当它报告它时,后续代码不再监听它并且正在运行幸福与“未定义”的答案。坏。

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

听起来很熟悉?你如何保持对Promises按时发布后续代码的适当控制?

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

1 个答案:

答案 0 :(得分:0)

如果没有看到您的实际代码,我们无法专门回答。

  

听起来很熟悉?你如何保持对Promises释放的适当控制   按时跟进代码?

答案总是要解决链条中的第一个承诺,直到你准备好执行事物并构建你的承诺链,这样依赖的东西才能被执行,直到他们等待的东西已经妥善解决了。如果某件事情过早执行,那么您要么过早地调用某些内容,要么您的承诺结构不正确。如果没有看到您的实际代码,我们无法确定。

常见的错误是:

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

应该是:

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

你应该传递对下一个异步函数的引用,而不是立即调用它并传递它的返回值。

  

我想也许第一次调用例程就可以启动一个数组   传入Promise.all后来调用会添加另一个条目   那个数组。我还没有尝试过。疯狂?

您无法将数组传递给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(...)