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