你可能已經聽說Node.js是「基於Chrome的V8 JavaScript引擎的異步JavaScript運行的」,並且它「使用事件驅動的非阻塞I / O模型,使其輕量級和高效」。但對某些人來說,這不是最好的解釋,或許太過於概念化。
首先要了解什麼是Node.js?其次要知道Node.js究竟「異步」與「同步」有什麼不同意思?還要討論,「事件驅動」和「非阻塞」的含義是什麼?
什麼是Node.js
Node只是一個環境或運行時,可以在瀏覽器之外運行普通的JavaScript(略有不同)。
我們可以使用它來構建桌面應用程式(使用像Electron這樣的框架),編寫Web或app伺服器等等。
阻塞/非阻塞和同步/異步
假設我們正在進行資料庫調用以檢索有關用戶的屬性,該調用需要時間,如果請求是「阻塞」,那麼這意味著它將阻止我們的程序執行,直到調用完成。在這種情況下,我們發出了「同步」請求,它最終阻止了線程。
因此,同步操作會阻塞進程或線程,直到該操作完成,使線程處於「等待狀態」。一個異步操作,在另一方面,是非阻塞的,它允許執行線程繼續進行,無論操作完成所花費的時間或完成操作的結果如何,並且線程的任何部分都不會在任何時候進入等待狀態。
讓我們看一下阻塞線程的同步調用的另一個例子。假設我們正在構建一個應用程式,用於比較兩個Weather API的結果,以找出它們的差異化。我們以阻塞的方式調用Weather API One並等待結果。得到結果後,我們調用Weather API Two並等待其結果。
請允許我個人指出一個問題:重要的是要認識到並非所有同步調用都必然是阻塞的。
如果同步操作可以設置完成而不阻塞線程或導致等待狀態,則它是非阻塞的。大多數情況下,同步調用將被阻塞,完成所需的時間取決於多種因素,例如API伺服器的速度,最終用戶的網際網路連接下載速度等。
對於上圖,我們不得不等待一段時間才能從API One中檢索第一批結果。此後,我們不得不等待同樣的時間來獲得API Two的回覆。
在非阻塞調用的情況下,我們會有這樣的事情:
你可以清楚地看到我們完成執行的速度有多快,而不是等待API One然後等待API Two,我們可以等待它們同時完成並將調用速度提高近50%。
因此請注意,一旦我們調用了API One並開始等待它的響應,我們也調用了API Two並開始等待它的同時響應它。
我們相信通過實驗測試之後,相信很多人會更加了解阻塞,非阻塞,和同步,異步的使用。