【问题标题】:Javascript, Node, Promises, and recursionJavascript、Node、Promises 和递归
【发布时间】:2015-12-17 03:08:37
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你不想在这里贴代码墙,你能把你的代码贴在小提琴里吗?没有代码很难提供帮助。
  • 当然是一个有效的观点。由于其他原因,小提琴选项是不可能的。对不起。无论如何,谢谢。

标签: javascript node.js recursion bluebird


【解决方案1】:

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

听起来很熟悉?你如何保持对 Promise 发布的适当控制 是否按时跟进代码?

答案始终是在您准备好执行任务之前不解决链中的第一个 Promise,并构建您的 Promise 链,以便依赖的事物在它们等待的事物正确执行之前不会被执行解决。如果某事执行得太快,那么您要么调用某事太快,要么您的承诺结构不正确。如果没有看到您的实际代码,我们无法确定。

一个常见的错误是这样的:

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(...)

【讨论】:

  • 您提供了两种异步控制模型。我用过你喜欢的那个。我更经常使用 "someAsync().then(function(return, error) {if (error) ...; return someOtherAsync()}).then( ... )。不过,好点。
  • @BaldEagle - 您是否明白,如果不查看代码的相关部分,我们就无法准确地告诉您您的代码出了什么问题?所以,没有你的代码,我们能做的就是提供疯狂的猜测?
  • 在我的递归中,总是涉及到相同的函数;链中没有其他人。称之为a()。每个 resolve() 到 a() 看起来都一样;在对最后一个执行 resolve() 之前,我不知道有任何将 resolve() 到第一个的能力,以便它可以将之前的 resolve() 解析到第一个……直到第一个。然而,应该依赖于第一次调用完成的代码在第一次 resolve() 发出后立即开始。
  • 我完全明白了。我对这段代码感到沮丧。我并不是要把挫败感转嫁给你。很抱歉。
  • @BaldEagle - 如果您发布相关代码,我们可以进一步帮助您。如果您不发布相关代码,我们将无法进一步帮助您。就这么简单。
猜你喜欢
  • 2018-01-04
  • 2020-08-19
  • 2016-10-20
  • 2023-03-14
  • 2016-06-23
  • 2019-06-11
  • 2015-08-04
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多