什麼是非同步

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

JS是如何是實現非同步操作的?

    js是單執行緒語言,JS的非同步是通過回撥函式實現的,即通過任務佇列,在主執行緒執行完當前的任務棧(所有的同步操作),主執行緒空閒後輪詢任務佇列,並將任務佇列中的任務(回撥函式)取出來執行。"回撥函式"(callback),就是那些會被主執行緒掛起來的程式碼。非同步任務必須指定回撥函式,當主執行緒開始執行非同步任務,就是執行對應的回撥函式。

    雖然JS是單執行緒的但是瀏覽器的核心是多執行緒的,在瀏覽器的核心中不同的非同步操作由不同的瀏覽器核心模組排程執行,非同步操作會將相關回調新增到任務佇列中。而不同的非同步操作新增到任務佇列的時機也不同,如 onclick, setTimeout, ajax 處理的方式都不同,這些非同步操作是由瀏覽器核心的 webcore 來執行的,webcore 包含上圖中的3種 webAPI,分別是 DOM Binding、network、timer模組。

JS中的非同步執行機制如下:  

(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