什么是異步
提起異步大家大家首先應該想到同步,首先解釋一下什么是同步。同步即為按照順序執行,下一任務需要等前一個任務執行完成后才可以開始。那異步是什么呢,簡單理解就是和同步相反,他不用等待上一個任務完成就可以開始,像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)主線程不斷重復上面的第三步。


異步的幾種實現方式
- 回調函數
- 使用promise
- 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