2016-01-16 27 views
0

我知道阻止代碼在node.js中不鼓勵,因爲它是單線程的。我的問題是詢問在某些情況下阻止代碼是否可以接受。何時在node.js中阻止代碼可接受?

例如,如果我正在運行需要連接MongoDBExpress網絡服務器,在數據庫連接建立之前阻止事件循環是否可以接受?這是假設所有由Express服務的頁面都需要數據庫查詢(如果MongoDB未初始化,這將會失敗)。

另一個例子是在初始化之前需要配置文件內容的應用程序。在這種情況下,使用fs.readFile而不是fs.readFileSync有什麼好處?

有沒有辦法解決這個問題?將所有代碼封裝在回調中,還是承諾最好的方法?這與以上例子中的阻塞代碼有什麼不同?

回答

1

這是真的由你來決定什麼是可以接受的。你會這樣做,通過確定什麼是封鎖的後果......在個案基礎上。這一分析將考慮:

  • 發生頻率,
  • 事件循環多久很可能被阻塞,
  • 的影響,在這種情況下阻擋將對可用性。

很明顯,有一些方法可以避免阻塞,但這些方法往往會增加應用程序的複雜性。真的,您需要根據具體情況來決定...是否需要增加複雜性。

底線:>>您< <需要根據您對應用程序和用戶的理解來決定什麼是可接受的。


1 - 例如,在一個遊戲,將在切換「水平」比活性播放期間更容易被接受阻止的UI。或者對於一般的Web服務,在加載配置文件或建立數據庫連接時「阻止一次」阻塞在網絡服務器啓動期間更可接受,如果這發生在每個請求上。

+0

謝謝!這是我想知道的。 – WillS

0

根據我的經驗,大多數任務應該在回調中處理或通過返回承諾來處理。你不想在Node應用程序中阻塞代碼。這就是它的好處!大多數情況下,如果沒有連接,它將在它有機會連接之前崩潰。它不會真的對API調用產生影響,因爲你的服務器將會死機!

來源:我是一個教導MEAN堆棧的開發者。

-1

你的兩個例子是完全不同的。這個區別實際上自己回答了這個問題。

從數據庫中獲取數據取決於連接到該數據庫。任何依賴於該數據的代碼都依賴於該連接。這些事情必須順序發生,以使應用程序發揮作用並具有意義。

另一方面,readFileSync將阻止所有代碼,而不僅僅是依賴它的代碼。您可以在建立數據庫連接的同時開始讀取csv文件。一旦完成,您可以將該csv數據添加到數據庫。

+0

給出的例子完全是單獨的例子。在這兩個示例中,都假設應用程序的其餘部分依賴於數據庫連接或讀取文件的結果。 – WillS

+0

這就是我的觀點。如果存在依賴關係,它需要被阻止。這與語言特定的設計模式無關。關於您的評論,readFile和readFileSync與您的其他應用程序完全相同。這與語言設計模式無關。這是適用於每種語言的基本控制流程。 – cdbajorin