1. 程式人生 > >JS事件迴圈詳解

JS事件迴圈詳解

本文講什麼?

伴隨著JavaScript這種web瀏覽器指令碼語言的普及,對它的事件驅動互動模型,以及它與Ruby、Python和Java中常見的請求-響應模型的區別有一個基本瞭解,對您是有益的。在這篇文章中,我將解釋一些JavaScript併發模型的核心概念,包括其事件迴圈和訊息佇列,希望能夠提升你對一種語言的理解,這種語言你可能已經在使用但也許並不完全理解。

這篇文章是寫給誰的?

這篇文章是針對在客戶端或伺服器端使用或計劃使用JavaScript的web開發人員的。如果你已經精通事件迴圈,那麼這篇文章的大部分對你來說會很熟悉。對於那些還不是很精通的人,我希望能給你提供一個基本的瞭解,這樣可以更好地幫助你閱讀和編寫日常程式碼。

非阻塞I / O

在JavaScript中,幾乎所有的I/O都是非阻塞的。這包括HTTP請求,資料庫操作和磁碟讀寫,單執行緒執行要求在執行期執行一個操作時,提供一個回撥函式,然後繼續做其它的事情。當操作已經完成時,訊息和已提供的回撥函式一起插入到佇列。在將來的某個時候,訊息從佇列移除,回撥函式觸發。

雖然這種互動模型可能對已經習慣使用使用者介面的開發人員很熟悉,比如“mousedown,”和“click”事件在某一時刻被觸發。這與通常在伺服器端應用程式進行的同步式請求-響應模型是不同的。

讓我們來比較一下兩小塊程式碼,發出HTTP請求到www.google.com和輸出響應到控制檯。首先看看Ruby,配合使用Faraday(一個Ruby 的HTTP 客戶端開發庫):

response = Faraday.get 'http://www.google.com'
puts response
puts 'Done!'

執行路徑很容易跟蹤:

  1. 執行get方法,執行的執行緒等待,直到收到響應
  2. 從谷歌收到響應並返回給呼叫者,它儲存在一個變數中

變數的值(在本例中,就是我們的響應)輸出到控制檯
值“Done!“輸出到控制檯