国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表

圖片精選

主站蜘蛛池模板: 凤城市| 福建省| 呼伦贝尔市| 平顶山市| 揭阳市| 年辖:市辖区| 柞水县| 彝良县| 额敏县| 屯昌县| 抚顺市| 沅陵县| 永嘉县| 蓬溪县| 嘉兴市| 南靖县| 灵璧县| 冕宁县| 万全县| 包头市| 饶阳县| 卢龙县| 托里县| 武冈市| 临沭县| 青冈县| 麻栗坡县| 集安市| 甘孜| 高陵县| 来宾市| 上饶县| 富蕴县| 逊克县| 林芝县| 宁晋县| 子洲县| 赤水市| 黄梅县| 武陟县| 定安县|