最初使用回呼函式
? 由于最初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做了個概述,
要掌握的其他細節還有很多
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/149817.html
標籤:JavaScript
上一篇:秒秒鐘破解eval加密
