2017-03-01 243 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()做分析。話雖如此,依靠節點引擎來處理像這樣的背景中的任何關鍵事務可能是一種糟糕的設計實踐,並且應該考慮其他方法,例如,持久隊列。