2017-01-10 99 views
1

我不是說ES7的異步,而是像回調和promisses一般的異步函數。何時使用異步nodejs?

因此,我研究了關於NodeJS和事件循環的所有內容。一切都讓我相信NodeJS有一種異步的錯覺。

據我瞭解,這隻有當功能必須通過外部媒體傳遞時纔有效。例如,執行讀取文件(將由OS API使用),或執行將使用外部API的請求。

我發現很少有人談論它,我想在這裏與你討論這個問題。 我的問題是: 我對這個想法是否正確?而且,如果有實際的方法來找出異步工作在哪裏,它不支付什麼?在某些情況下,如果我是正確的,異步只會花費更多的內存。

+1

'所以,我研究了關於NodeJS和事件循環的所有內容。所有事情都讓我相信NodeJS有一種異步的錯覺 - 你需要再次學習 - 當你使用的函數是異步的時候,你會在nodejs中使用異步函數...你不能決定使用異步函數編寫同步代碼 - 當然,很多功能都有同步和異步版本,但在大多數情況下(超過50%),異步版本是首選 –

+0

所以,這就是爲什麼我問...大聲笑 –

+0

我打算把'; - )'在「你需要重新學習之後」 - 在面頰評論中是口舌,根本不意味着苛刻:p –

回答

1

Node.js異步工作,如果你在做一些阻塞I/O(比如使用fs .readFileSync()或其他同步函數)時,完整的node.js運行時進程將在該調用期間停止處理其他任何事情。因此,在web請求處理中,您不會調用同步函數(僅在node.js命令行應用程序中並在應用程序啓動等)

這只是node.js的基本功能;其結果是,node.js/JavaScript沒有,也不需要​​線程同步功能,例如。Java

從技術上講,多線程運行的node.js進程中唯一的地方是內部libuv庫,僅用於補償主機系統缺少的異步I/O。

如果您的處理不是由I/O事件觸發的,則可以使用nodes.js timers創建人爲事件。通常情況下,您認爲這會使nodes.js不方便或不適合CPU限制的處理。

1

正好只有當函數必須通過外部介質時,這纔有效。這是單線程異步事件循環的折衷。您應該避免在node.js中執行任何CPU綁定計算,因爲它阻止了事件循環,因此不會回覆任何回調。

節點只在OS IO調用時產生,當使用回調或承諾時它不會產生。這些是處理基於IO的調用的兩種方式,但本身並不是異步的。 (我見過很多項目,人們爲同步代碼創建基於回調的API:)