2018年已經(jīng)到了5月份,node的4.x版本也已經(jīng)停止了維護(hù)我司的某個服務(wù)也已經(jīng)切到了8.x,目前正在做koa2.x的遷移將之前的generator全部替換為async但是,在替換的過程中,發(fā)現(xiàn)一些濫用async導(dǎo)致的時間上的浪費(fèi) 所以來談一下,如何優(yōu)化async代碼,更充分的利用異步事件流 杜絕濫用async
首先,你需要了解Promise
Promise是使用async/await的基礎(chǔ),所以你一定要先了解Promise是做什么的
Promise是幫助解決回調(diào)地獄的一個好東西,能夠讓異步流程變得更清晰。
一個簡單的Error-first-callback轉(zhuǎn)換為Promise的例子:
const fs = require('fs')function readFile (fileName) { return new Promise((resolve, reject) => { fs.readFile(fileName, (err, data) => { if (err) reject(err) resolve(data) }) })}readFile('test.log').then(data => { console.log('get data')}, err => { console.error(err)})我們調(diào)用函數(shù)返回一個Promise的實(shí)例,在實(shí)例化的過程中進(jìn)行文件的讀取,當(dāng)文件讀取的回調(diào)觸發(fā)式,進(jìn)行Promise狀態(tài)的變更,resolved或者rejected狀態(tài)的變更我們使用then來監(jiān)聽,第一個回調(diào)為resolve的處理,第二個回調(diào)為reject的處理。
async與Promise的關(guān)系
async函數(shù)相當(dāng)于一個簡寫的返回Promise實(shí)例的函數(shù),效果如下:
function getNumber () { return new Promise((resolve, reject) => { resolve(1) })}// =>async function getNumber () { return 1}兩者在使用上方式上完全一樣,都可以在調(diào)用getNumber函數(shù)后使用then進(jìn)行監(jiān)聽返回值。 以及與async對應(yīng)的await語法的使用方式:
getNumber().then(data => { // got data})// =>let data = await getNumber()await的執(zhí)行會獲取表達(dá)式后邊的Promise執(zhí)行結(jié)果,相當(dāng)于我們調(diào)用then獲取回調(diào)結(jié)果一樣。 P.S. 在async/await支持度還不是很高的時候,大家都會選擇使用generator/yield結(jié)合著一些類似于co的庫來實(shí)現(xiàn)類似的效果
async函數(shù)代碼執(zhí)行是同步的,結(jié)果返回是異步的
async函數(shù)總是會返回一個Promise的實(shí)例 這點(diǎn)兒很重要所以說調(diào)用一個async函數(shù)時,可以理解為里邊的代碼都是處于new Promise中,所以是同步執(zhí)行的而最后return的操作,則相當(dāng)于在Promise中調(diào)用resolve:
async function getNumber () { console.log('call getNumber()') return 1}getNumber().then(_ => console.log('resolved'))console.log('done')// 輸出順序:// call getNumber()// done// resolvedPromise內(nèi)部的Promise會被消化
也就是說,如果我們有如下的代碼:
function getNumber () { return new Promise(resolve => { resolve(Promise.resolve(1)) })}getNumber().then(data => console.log(data)) // 1如果按照上邊說的話,我們在then里邊獲取到的data應(yīng)該是傳入resolve中的值 ,也就是另一個Promise的實(shí)例。
|
新聞熱點(diǎn)
疑難解答
圖片精選