JS ES6異步解決方案
由于最初j s官方?jīng)]有明確的規(guī)范,各種第三方庫中封裝的異步函數(shù)中傳的回調(diào)函數(shù)中的參數(shù)沒有明確的規(guī)范, 沒有明確各個參數(shù)的意義, 不便于使用。
但是node中有明確的規(guī)范
node中的的回調(diào)模式:
1. 所有回調(diào)函數(shù)必須有兩個參數(shù),第一個參數(shù)表示錯誤,第二個參數(shù)表示結(jié)果
2. 所有回調(diào)函數(shù)必須作為函數(shù)最后的參數(shù)
3. 所有回調(diào)函數(shù)不能作為屬性出現(xiàn)
es6 異步處理模型Es6 出現(xiàn)以后, 官方就提出了異步處理的規(guī)范, 提出了一種適用于所有異步場景的處理模型。該模型有:
兩個階段: 未決unsettled, 已決settled。 三個狀態(tài): pending掛起狀態(tài) , resolved成功, rejected失敗 總是從未決階段推向已決階段,且已決階段的狀態(tài)不再改變任務(wù)已決狀態(tài)后可能需要后續(xù)處理,
針對resolved的后續(xù)處理我們稱之為thenable 針對rejected的后續(xù)處理我們稱之為catchable為該異步模型量身打造的API : promise如何使用promise
Copy
const task = new Promise((resolve, reject) => { // 任務(wù)未決階段代碼 // 立即執(zhí)行 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 后任務(wù)推向已決, 后續(xù)處理在then 或者 catch中 處理。
注意
pending狀態(tài) =》rejected狀態(tài) :
Copy
1. 調(diào)用reject
2. 代碼執(zhí)行報錯
3. 手動拋出錯誤
后續(xù)處理函數(shù)一定是異步的,且會放到微隊列中,
j s執(zhí)行棧清空后會先執(zhí)行微隊列中的任務(wù),微隊列里任務(wù)清空后才會執(zhí)行宏隊列中的任務(wù)。
宏任務(wù)隊列有:setTimeout,setInterval,setImmediately,I/O,UI render 微任務(wù)隊列有:promise,process.nexttick,Object.observe(已經(jīng)不用了),Mutation.observeAsync await 是es7新增的promise的語法糖大家也可以了解下,本文只是對promise做了個概述,要掌握的其他細節(jié)還有很多
以上就是JS ES6異步解決方案的詳細內(nèi)容,更多關(guān)于ES6異步解決方案的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. idea設(shè)置提示不區(qū)分大小寫的方法2. HTTP協(xié)議常用的請求頭和響應(yīng)頭響應(yīng)詳解說明(學習)3. .NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)4. IntelliJ IDEA創(chuàng)建web項目的方法5. CentOS郵件服務(wù)器搭建系列—— POP / IMAP 服務(wù)器的構(gòu)建( Dovecot )6. css代碼優(yōu)化的12個技巧7. ASP.NET MVC通過勾選checkbox更改select的內(nèi)容8. 原生JS實現(xiàn)記憶翻牌游戲9. django創(chuàng)建css文件夾的具體方法10. Django使用HTTP協(xié)議向服務(wù)器傳參方式小結(jié)
