终止javascript中的挂起的承诺

时间:2019-07-13 12:17:13

标签: javascript node.js asynchronous

我有一个JavaScript程序,希望通过提供RabbitMQ的输入来持续执行。问题在于它有时会无限期地挂起并阻塞整个执行过程。我最初的想法是使用Promise.race在特定时间段后超时并让下一条消息进入,但是损坏的Promise本身仍在后台运行,并且永远不会结束。在此设计中,我将开始生成“僵尸”承诺,这些承诺最终将消耗我的系统资源(因为我的应用程序一直在运行)。我对这个程序真的没有控制权。我无法向其发送abort()函数。所以我的问题是: 是否有办法杀死Promise并将其完全从事件循环中删除?

如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?会正确清理我的系统资源吗?

2 个答案:

答案 0 :(得分:5)

  

有没有办法杀死Promise并将其完全从事件循环中删除?

不。承诺表示异步任务的结果 ,他们不知道任务本身,因此无法取消它。

  

如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?

这是一个选择,但是生成进程是一项繁重的操作,因为它需要自己的运行时/内存/等。因此您不应该经常这样做。

您可以管理cancellation of the underlying asynchronous task。不过,这取决于实际的任务。

答案 1 :(得分:3)

您正在关注错误的部分(可以理解!)。 promise 没有挂起。您正在使用诺言来观察的事物已被挂起。承诺不做任何事情,它们只是提供一种观察正在完成的事情的方法。

要解决此问题,您需要查看它尚未完成的操作,然后在该级别解决问题。如果事物有某种取消或中止的方法,那就太好了;否则,请在更深层次上使该过程超时,并拒绝它的承诺。

  

如果不可能,那么将第二个nodejs程序作为子进程生成并在出现问题时将其杀死呢?会正确清理我的系统资源吗?

是的。它更昂贵,但这是一个折衷。如果挂起,您可以完全杀死它。