1. 程式人生 > >javaScript非同步和事件輪詢機制

javaScript非同步和事件輪詢機制

前提

本文的一個重要的前提就是js的一個特點就是:js是單執行緒語言,js是單執行緒語言,js是單執行緒語言,在這種模式下可能會產生一個比較常見問題,頁面假死,主要原因就是有一個耗時任務在進行,導致後面的任務無法開始,js為解決這個問題提供了兩種模式:同步非同步

什麼是非同步

提起非同步大家大家首先應該想到同步,首先解釋一下什麼是同步。同步即為按照順序執行,下一任務需要等前一個任務執行完成後才可以開始。那非同步是什麼呢,簡單理解就是和同步相反,他不用等待上一個任務完成就可以開始,像io操作,網路請求一般會採用非同步的方式進行。

事件輪詢(event Loop)

我們在執行程式碼時通常是一個主執行緒棧按照順序執行,此時如果遇到非同步任務就會把非同步任務放到任務佇列中。等主執行緒執行完畢後再載入任務佇列到主執行緒,如此迴圈。
(1)所有同步任務都在主執行緒上執行,形成一個執行棧(execution context stack)。
(2)主執行緒之外,還存在一個"任務佇列"(task queue)。只要非同步任務有了執行結果,就在"任務佇列"之中放置一個事件。
(3)一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務佇列",看看裡面有哪些事件。那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行。
(4)主執行緒不斷重複上面的第三步。
事件輪詢

非同步的幾種實現方式

  1. 回撥函式
  2. 使用promise
  3. ES7的Async/Await

參考地址

http://www.ruanyifeng.com/blog/2014/10/event-loop.html
https://www.cnblogs.com/nullcc/p/5841182.html
https://segmentfault.com/a/1190000011198232
https://github.com/wangfupeng1988/js-async-tutorial/blob/master/part1-basic/02-event-loop.md