2015-08-20 11 views
0

我的主要功能是運行n個任務。理想情況下,當這樣的任務完成時,主函數的回調函數將被調用來終止整個過程。但是,這n個任務中的一部分有時還沒有完成(每個任務都沒有調用回調函數),從而阻止主函數的終止?如何確保函數始終被終止,以防在node.js中調用回調嗎?

有沒有什麼辦法可以確保這些n個任務中的每個任務總是完成(回調被調用)以防回調未被調用?

+0

使用[tag:node-async]和setTimeout之類的東西,或者一個處理長時間運行的函數的適當的超時模塊。 – brandonscript

+0

感謝您的評論。但是,我自己找不到合適的模塊。你能推薦我任何模塊及其用法嗎? @remus –

回答

-1

假設這些都是異步的,我會試用Bluebird並使用Promises。 您可以使用Promise.settle確保一切完成,Promise是否已完成。

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

+1

如果回調從未被調用,切換到承諾將無濟於事。 '.settle()'有助於在你只想知道一組承諾何時完成的情況下,而不管它們是成功完成還是有錯誤。如果承諾永遠不會解決或拒絕,'.settle()'也不會觸發。 – jfriend00

1

這是沒有任何具體的代碼很難回答的問題,因爲解決這個問題的途徑都與特定的代碼。解決這個問題的最好方法是進入每個特定的操作並確保始終調用回調(修復導致它不被調用的錯誤)。然後,您可以在任何地方可靠地使用代碼而不會出現此問題

如果你不能進入代碼本身,那麼你所能做的就是設置一個計時器,並且如果回調在某個時間段內(你定義的)沒有被調用,那麼你可以調用用超時錯誤回叫自己。你可以通過掛鉤這個函數來完成這個工作,這樣你就可以攔截回調來知道它何時被調用,以及如何用超時錯誤調用它。

如果您可以爲您正在嘗試解決的情況提供實際代碼,那麼我們可以在答案中提供更具體的代碼。

+0

不好意思回覆遲到。 我只是想出了我的程序的主要問題。這是因爲我向服務器發送了很多請求。在一些請求中,「request(url,function(error,response,html){})」中的回調沒有被調用(我等待了很長時間,但仍然看不到回調被調用)。我的程序必須處理大量的請求。一個解決方案可能是逐個處理這些請求,或者按照1秒或2秒的時間間隔來處理,但是這會浪費很多時間。還有其他解決方案嗎? –

+0

@MrCold - 如果您不控制服務器,通常的解決方案是限制發送給X的請求數量,其中X是您測試過的值與您的服務器基礎結構配合使用的時間。你可以在你自己的代碼中實現這個功能,通過保留一個「空中」請求的計數器,並且每次完成時都會啓動一個新的異步庫。這個異步庫有一個名爲'.eachLimit()'的功能,可以處理這種事情 – jfriend00

+0

@MrCold - 另外我的猜測是你的代碼在某處忽略了某種錯誤,因爲一個請求不應該只是消失,合適的代碼將完成請求或報告錯誤,這可能也應該修復。 – jfriend00