什么是JS異步編程
同步編程(Synchronous)
眾所周知,js是運行在瀏覽器的腳本語言,它的作用就是用來完成頁面的互動效果,
也是就是 JS的DOM操作,為了防止有的在對DOM執行修改操作,有的對這個DOM執行洗掉操作,這時候瀏覽器不知道該聽誰的了,為了避免這種沖突,javaScript就被設計成為了單執行緒作業,
javaScript中只有一個執行堆疊,就好比有很多人買鴻星爾克,但是只有一個收銀臺,所以只能一個一個的付錢,這樣的好處是可以讓瀏覽器有條不紊的運行,壞處是當遇到回傳時較長的時候,后面的代碼會等待執行,會出現卡死現象,
異步編程(Asynchronous)
JavaScript 執行異步任務時,不需要等待回應回傳, 可以繼續執行其他任務,而在回應回傳時,會得到通知,執行回呼或事件 處理程式,這樣javaScript就可以同時執行耗時較大的任務
EventLoop、訊息佇列
EventLoop只做一件事情,就是監聽呼叫堆疊和訊息佇列
當呼叫堆疊中的函式執行完后,它就會從訊息佇列中取出第一個回呼函式,重新放入到呼叫堆疊(第一輪代碼已經執行完成)中執行,
當第二輪需要等待的函式執行完畢后,會進入訊息佇列一次等候,EventLoop會把他們再次放到呼叫堆疊中依次執行,
呼叫堆疊是瀏覽器正在執行的串列,而訊息佇列這是代辦的串列,

宏任務、微任務
宏任務先執行,執行結束進入回呼佇列的末尾,
微任務后執行,執行結束在本輪回呼佇列的末尾立即執行
執行先宏后微,彈出先微后宏
目前絕大多數異步呼叫都是作為宏任務執行
Promise物件,MutationObserver物件,node中process.nextTick微任務
// 宏任務
setTimeout(() => {
console.log(1)
})
// 微任務
queueMicrotask(() => {
console.log(3)
})
// 同步
console.log(2)
同一層級內:
同步代碼(普通代碼、promise建構式)>> 微任務(nextick > queueMicrotask、then)>> 宏任務(setTimeout)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/291503.html
標籤:其他
上一篇:淺學JavaScript03
