2017-03-01 200 views
0

我有一个Node.js/Express应用程序,有时候我需要执行一个不需要等待结果的非关键异步任务(例如,一个调用来保存一些在分析平台的数据):不等待结果的异步任务

router.post("/", function (req, res, next) { 
 
    criticalTask() 
 
     .then(result => { 
 
      res.json({success: true}); 
 
      nonCriticalTask(); 
 
     }) 
 
     .catch(next) 
 
}

在那个时候,nonCriticalTask()地没有在中间终止它完全执行的保证吗?这有什么限制吗?

+1

如果'nonCriticalTask​​()'中有任何异常/错误发生,是的,它会在中间终止。你必须处理它。但是你问的是持有。您不等待结果执行任何其他任务。如果'nonCriticalTask​​'内的任何内容都是异步的,你就会有优势。 – RaR

+2

我不确定你认为会终止它,你能详细说明为什么你认为它可能不会被调用,或者为什么它可能不会完成。 – nycynik

+0

具体来说,在我们的例子中,'nonCriticalTask​​'涉及到向外部服务发出HTTP POST请求,有时TCP会话在调用过程中被终止,而不发送完整的POST数据(根据这个外部服务提供者的日志如果这很重要,那就是Zapier)。我们的服务器日志中没有任何迹象表明存在任何错误。一旦我们转向等待'nonCriticalTask​​'的结果,问题就没有了。所以我试图找到一些关于预期行为的文档。 – Anton

回答

0

最后我找不到任何文档。在大量实验和日志记录之后,似乎nonCriticalTask()不会终止并且由节点执行,并且如果仍有任务仍在执行或正在使用处理,节点不会退出,例如,数据库连接已打开。

所以它似乎适用于我的nonCriticalTask()做分析。话虽如此,依靠节点引擎来处理像这样的背景中的任何关键事务可能是一种糟糕的设计实践,并且应该考虑其他方法,例如,持久队列。