非同步模式(Asynchronous)
概念:
不會去等待這個任務的結束才開始下一個任務,開啟過後就立即往後執行下一個任務,後續邏輯一般會通過回撥函式的方式定義。單執行緒的JavaScript語言需要通過赭紅模式去同時處理大量的耗時任務。對於開發者來說難點是程式碼的執行順序混亂
講解
console.log('gobal begin')
setTimeout(function timer1(){
console.log('timer1 invoke')
},1800)
setTimeout(function timer2(){
console.log('timer2 invoke')
setTimeout(function inner(){
console.log('inner invoke')
},1000)
},1000)
console.log('global end')
1、js執行引擎會把整體的程式碼全部載入進來
2、然後在呼叫棧(Call stack)當中壓入一個匿名(anonymous)的全域性呼叫,這個匿名的呼叫可以理解為把全部的程式碼放入到一個匿名的函式當中去執行,然後去逐行執行
3、呼叫棧中依次壓入上述程式碼去執行,呼叫棧中:
(anonymous) 逐行執行
console.log(‘global begin’) 執行 彈出
setTimeout(timer1) 執行
為timer1開啟一個倒數計時器 1.8stimer1放到一邊,這個倒數計時器是單獨工作不會受js單執行緒影響
彈出
setTimeout(timer2) 執行
為timer2開啟一個倒數計時器 1stimer2放到一邊
彈出
console.log(‘global end’) 執行 彈出
此時呼叫棧被清空 event loop開始發揮作用
event loop:負責監聽呼叫棧與訊息佇列,呼叫棧所有任務都結束了,event loop 會從訊息佇列中取出第一個回撥函式壓入到呼叫棧,此時訊息佇列為空,執行暫停下來了,等倒數計時結束後,timer2倒數計時先結束 放入到訊息佇列的第1位,timer1進入訊息佇列第2位,事件迴圈監聽到訊息佇列變化
開啟新一輪的呼叫棧
timer2壓入到呼叫棧 執行
setTimeout(inner) 執行
console.log(‘timer2 invoke’) 執行 彈出
為inner開啟一個倒數計時器 1sinner放到一邊
彈出
timer1 執行
console.log(‘timer1 invoke’) 執行 彈出
彈出
開啟新一輪的呼叫棧
inner壓入到呼叫棧 執行
console.log(‘inner invoke’) 執行 彈出
彈出
結束
注意:js時單執行緒,瀏覽器不是單執行緒。js呼叫的某些內部的api並不是單執行緒的
我們說的同步還是非同步不是指寫程式碼的方式,而是執行環境提供的API是以同步或非同步模式的方式工作
相關文章
- .Net Core自實現CLR非同步程式設計模式(Asynchronous programming patterns)非同步程式設計設計模式
- 非同步 PHP:為什麼? ( Asynchronous PHP: Why?)非同步PHP
- IO通訊模型(二)同步非阻塞模式NIO(NonBlocking IO)模型模式BloC
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- IO模式和IO多路複用(阻塞IO、非阻塞IO、同步IO、非同步IO等概念)模式非同步
- Others_1_Asynchronous
- java同步非阻塞IOJava
- 同步、非同步、阻塞、非阻塞的區別非同步
- Simple FSM 3(asynchronous reset)
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 同步模式(Synchronous)模式
- 同步阻塞、同步非阻塞、多路複用的介紹
- 【設計模式】非同步阻塞、非同步回撥模式設計模式非同步
- Simple FSM1(asynchronous reset)
- Simple FSM2(asynchronous reset)
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- asynchronous i/o (aio) on HP-UXAIUX
- Java 非阻塞 IO 和非同步 IOJava非同步
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- 一篇文章讀懂阻塞,非阻塞,同步,非同步非同步
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- 嚴格模式和非嚴格模式區別模式
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- 從同步原語看非阻塞同步以及Java中的應用Java
- 乾坤大挪移,如何將同步阻塞(sync)三方庫包轉換為非同步非阻塞(async)模式?Python3.10實現。非同步模式Python
- Python中非同步模式Python非同步模式
- python中非同步非阻塞如何實現Python非同步