引言

  相信所有學過 JavaScript 都知道它是一門單線程的語言,這也就意味著 JS 無法進行多線程編程,但是 JS 當中卻有著無處不在的異步概念 。在初期許多人會把異步理解成類似多線程的編程模式,其實他們中有著很大的差別,要完全理解異步,就需要了解 JS 的運行核心——事件循環(huán)(event loop)。在之前我對事件循環(huán)的認識也是一知半解的,直到我看了 Philip Roberts 的演講 What the heck is the event loop anyway?,我才對事件循環(huán)有了一個全面的認識,所以我想寫一篇介紹 JS 事件循環(huán)的文章,以供大家學習和參考。

 一、為什么會有異步?

  為什么 JS 當中會有異步?我們想象一下,如果我們同步的執(zhí)行一下代碼會發(fā)生什么:

1 $.get(url, function(data) {2     //do something3 });

  在我們使用 ajax 進行通信的時候,我們都默認了它是異步的,但是如果我們設置其為同步執(zhí)行,會發(fā)生什么?如果你自己寫一個小的測試程序,將后臺代碼延遲5s你會發(fā)現(xiàn)瀏覽器會出現(xiàn)阻塞,直到 ajax 響應了之后才會正常運行。這便是異步模式要解決的首要問題,如何使瀏覽器非阻塞的運行任務。想象一下如果我們同步的執(zhí)行 ajax 請求的話,我們的等待的時間是一個未知數(shù),在網(wǎng)絡通信中可能很快也可能很慢,也可能永遠也不會響應,這也就會導致瀏覽器會阻塞在一個未知的任務上面,這也是我們不希望看到的。所以我們希望有一種方式能夠異步的處理程序,我們并不需要關心一個 ajax 請求會在何時完成,甚至它可以永遠不會響應,我們只需要知道在請求響應后該如何處理,并且在等待響應的這段時間內(nèi)我們還可以做一些其他的工作。因此,便有了 JavaScript Event Loop。

網(wǎng)友評論