【问题标题】:How to make sure a function is always terminated in case callback is not called in node.js?如果在 node.js 中未调用回调,如何确保函数始终终止?
【发布时间】:2015-11-13 14:41:39
【问题描述】:

我的主要功能运行 n 个任务。理想情况下,当这样n个任务完成后,会调用主函数的回调函数来终止整个进程。但是,这 n 个任务中的一些有时没有完成(每个任务中没有回调被调用),从而阻止了 main 函数终止?

有没有办法确保这 n 个任务中的每个任务总是完成(调用回调),以防不调用回调?

【问题讨论】:

  • node-async 与 setTimeout 或处理长时间运行函数的适当超时模块一起使用。
  • 感谢您的评论。但是,我自己找不到合适的模块。你能推荐我任何模块及其用法吗? @remus

标签: javascript node.js callback terminate


【解决方案1】:

假设这些都是异步的,我会尝试 Bluebird 并使用 Promises。 您可以使用 Promise.settle 确保一切都完成,无论 Promise 是否实现。

https://github.com/petkaantonov/bluebird/blob/master/API.md#settle---promise

【讨论】:

  • 如果从不调用回调,切换到 Promise 将无济于事。 .settle() 在您只想知道一组承诺何时完成的情况下提供帮助,无论它们是成功完成还是错误完成。如果承诺永远不会解决或拒绝,.settle() 也不会触发。
【解决方案2】:

这是一个没有任何具体代码的难题,因为解决这个问题的方法都与具体代码相关。修复它的最佳方法是进入每个特定操作并确保始终调用回调(修复导致它不被调用的错误)。然后,您可以在任何地方可靠地使用该代码而不会出现此问题。

如果你不能进入代码本身,那么你真正能做的就是设置一个计时器,如果在某个时间段(你定义的)内没有调用回调,那么你可以调用回调自己有超时错误。您可以通过挂钩函数来完成此操作,这样您就可以拦截回调以了解它何时被调用以及如何在超时错误时调用它。

如果您可以为您尝试修复的情况提供实际代码,那么我们可以在答案中提供更具体的代码。

【讨论】:

  • 抱歉回复晚了。我刚刚弄清楚我的程序的主要问题。这是因为我向服务器发送了许多请求。在某些请求中,“request(url, function(error, response, html){})”中的回调没有被调用(我等了很久,但还是看不到回调被调用)。我的程序必须处理大量请求。一个解决方案可能是一个一个地处理这些请求,或者以 1s 或 2s 的时间间隔处理这些请求,......但这会浪费很多时间。还有其他解决办法吗?
  • @MrCold - 如果您不控制服务器,通常的解决方案是限制您发送到 X 的请求数量,其中 X 是您测试过的值适用于您的服务器基础设施。您可以在自己的代码中通过保留“正在进行的”请求的计数器来实现这一点,并且每次完成时,您都会启动一个新请求。异步库有一个名为.eachLimit() 的功能可以为您做这种事情。
  • @MrCold - 我的猜测是您的代码在某处忽略了某种错误,因为请求不应该只是消失。正确的代码将完成请求或报告错误。这可能也应该修复。
猜你喜欢
  • 1970-01-01
  • 2015-09-23
  • 2020-05-22
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2019-11-06
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多