在Node.js中使用async函數(shù)的方法
在Node.js中使用async函數(shù)可以使基于Promise的異步代碼看起來像同步代碼一樣。通過使用async關(guān)鍵字來定義一個函數(shù),你可以在函數(shù)內(nèi)部使用await關(guān)鍵字。當(dāng)調(diào)用一個async函數(shù)時,它
在Node.js中使用async函數(shù)可以使基于Promise的異步代碼看起來像同步代碼一樣。通過使用async關(guān)鍵字來定義一個函數(shù),你可以在函數(shù)內(nèi)部使用await關(guān)鍵字。當(dāng)調(diào)用一個async函數(shù)時,它會返回一個Promise。如果這個async函數(shù)返回一個值,那么Promise就會被解決;如果函數(shù)中拋出一個錯誤,那么Promise就會被拒絕。
await關(guān)鍵字的用法
await關(guān)鍵字可以等待一個Promise被解決并返回其實現(xiàn)的值。如果傳遞給await的值不是一個Promise,它會將該值轉(zhuǎn)化為一個已解決的Promise。
遷移到async函數(shù)
如果你的Node.js應(yīng)用程序已經(jīng)在使用Promise,只需要將原先的鏈?zhǔn)秸{(diào)用改寫為使用await來處理這些Promise。如果應(yīng)用程序仍在使用回調(diào)函數(shù),則應(yīng)逐步轉(zhuǎn)向使用async函數(shù)??梢栽陂_發(fā)新功能時嘗試使用這項新技術(shù)。當(dāng)需要調(diào)用舊有的代碼時,可以簡單地將它們包裝成Promise并以新的方式調(diào)用??梢允褂脙?nèi)建的方法來實現(xiàn):
async函數(shù)的最佳實踐
在express中使用async函數(shù)比較簡單,因為express本身就支持Promise。但正如Keith Smith所指出的,如果Promise最終被拒絕而沒有進行錯誤處理,那么express路由處理器就會被掛起。為了解決這個問題,可以將異步處理器包裹在一個處理錯誤的函數(shù)中。
并行執(zhí)行
有時候,在編寫程序時需要同時獲取來自數(shù)據(jù)庫和外部服務(wù)的兩個輸入,然后再進行支付。由于前兩步之間沒有相互依賴關(guān)系,可以將它們并行執(zhí)行。可以使用方法來實現(xiàn):
使用Promise.race方法
有時候,只需要獲得最快返回的Promise的值,可以使用Promise.race方法??紤]以下例子:
當(dāng)執(zhí)行這段代碼時,如果Promise被拒絕且未進行處理,較新版本的Node.js會中斷整個進程。因此,在必要的情況下應(yīng)該使用try-catch來處理異常。
復(fù)雜的流程控制
async是一個在Node.js中用于異步流程控制的早期庫。它提供了一些幫助工具來控制異步操作,比如mapLimit,filterLimit,concatLimit以及priorityQueue。如果你不想重新發(fā)明輪子,并且愿意信任這個經(jīng)過實踐驗證、每月下載量高達5000萬的庫,你可以結(jié)合來簡單地重用這些函數(shù)。