es6異步解決方案


最初使用回調函數

​ 由於最初j s官方沒有明確的規范,各種第三方庫中封裝的異步函數中傳的回調函數中的參數沒有明確的規范, 沒有明確各個參數的意義, 不便於使用。

​ 但是node中有明確的規范

​ node中的的回調模式:

	1. 所有回調函數必須有兩個參數,第一個參數表示錯誤,第二個參數表示結果
	2. 所有回調函數必須作為函數最后的參數
	3. 所有回調函數不能作為屬性出現

es6 異步處理模型

Es6 出現以后, 官方就提出了異步處理的規范, 提出了一種適用於所有異步場景的處理模型。該模型有:

兩個階段: 未決unsettled, 已決settled。

三個狀態: pending掛起狀態 , resolved成功, rejected失敗

總是從未決階段推向已決階段,且已決階段的狀態不再改變

任務已決狀態后可能需要后續處理,

針對resolved的后續處理我們稱之為thenable

針對rejected的后續處理我們稱之為catchable

為該異步模型量身打造的API : promise

如何使用promise

const task = new Promise((resolve, reject) => {     
    // 任務未決階段代碼  
    // 立即執行  
    console.log("開始100米長跑");  
    setTimeout(() => {  
       if (Math.random() > 0.5) {  
           // 成功: 跑完了  
           // 推向成功  
           resolve("跑完了");  
       } else {  
           // 失敗: 腿摔斷了  
           // 推向失敗  
           reject("腿摔斷了");  
       }  
    }, 1000)
});
task.then((result) => {
  console.log(result);
}).catch((error) => {
  console.log(error);
})

1s 后任務推向已決, 后續處理在then 或者 catch中 處理。

注意

pending狀態 =》rejected狀態 :

1. 調用reject
2. 代碼執行報錯
3. 手動拋出錯誤

后續處理函數一定是異步的,且會放到微隊列中,

j s執行棧清空后會先執行微隊列中的任務,微隊列里任務清空后才會執行宏隊列中的任務。

宏任務隊列有:setTimeout,setInterval,setImmediately,I/O,UI render

微任務隊列有:promise,process.nexttick,Object.observe(已經不用了),Mutation.observe

Async await 是es7新增的promise的語法糖大家也可以了解下,本文只是對promise做了個概述,

要掌握的其他細節還有很多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM