因爲最初j s官方沒有明確的規範,各類第三方庫中封裝的異步函數中傳的回調函數中的參數沒有明確的規範, 沒有明確各個參數的意義, 不便於使用。javascript
可是node中有明確的規範java
node中的的回調模式:node
1. 全部回調函數必須有兩個參數,第一個參數表示錯誤,第二個參數表示結果 2. 全部回調函數必須做爲函數最後的參數 3. 全部回調函數不能做爲屬性出現
Es6 出現之後, 官方就提出了異步處理的規範, 提出了一種適用於全部異步場景的處理模型。該模型有:es6
兩個階段: 未決unsettled, 已決settled。api
三個狀態: pending掛起狀態 , resolved成功, rejected失敗promise
老是從未決階段推向已決階段,且已決階段的狀態再也不改變dom
任務已決狀態後可能須要後續處理,異步
針對resolved的後續處理咱們稱之爲thenable函數
針對rejected的後續處理咱們稱之爲catchablecode
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作了個概述,
要掌握的其餘細節還有不少