国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

如何更好的編寫js async函數(shù)

2024-05-06 15:34:18
字體:
供稿:網(wǎng)友

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// resolved

Promise內(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í)例。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 崇州市| 喀什市| 闸北区| 长海县| 稷山县| 左云县| 宿州市| 隆回县| 正阳县| 商都县| 屏山县| 沅江市| 舞钢市| 广灵县| 乐清市| 兴义市| 乌拉特前旗| 永泰县| 开远市| 绥芬河市| 施秉县| 措美县| 饶阳县| 萍乡市| 安丘市| 汨罗市| 岱山县| 阿拉善盟| 吉安县| 抚顺县| 团风县| 博兴县| 乌审旗| 鸡东县| 香格里拉县| 晋宁县| 青海省| 涿州市| 阿巴嘎旗| 女性| 临沂市|