<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Node.js 中使用 async 函數的方法

        來源:懂視網 責編:小采 時間:2020-11-27 22:25:34
        文檔

        Node.js 中使用 async 函數的方法

        Node.js 中使用 async 函數的方法:借助于新版 V8 引擎,Node.js 從 7.6 開始支持 async 函數特性。今年 10 月 31 日,Node.js 8 也開始成為新的長期支持版本,因此你完全可以放心大膽地在你的代碼中使用 async 函數了。在這邊文章里,我會簡要地介紹一下什么是 async 函數,以及它會如
        推薦度:
        導讀Node.js 中使用 async 函數的方法:借助于新版 V8 引擎,Node.js 從 7.6 開始支持 async 函數特性。今年 10 月 31 日,Node.js 8 也開始成為新的長期支持版本,因此你完全可以放心大膽地在你的代碼中使用 async 函數了。在這邊文章里,我會簡要地介紹一下什么是 async 函數,以及它會如

        借助于新版 V8 引擎,Node.js 從 7.6 開始支持 async 函數特性。今年 10 月 31 日,Node.js 8 也開始成為新的長期支持版本,因此你完全可以放心大膽地在你的代碼中使用 async 函數了。在這邊文章里,我會簡要地介紹一下什么是 async 函數,以及它會如何改變我們編寫 Node.js 應用的方式。

        1 什么是 async 函數

        利用 async 函數,你可以把基于 Promise 的異步代碼寫得就像同步代碼一樣。一旦你使用 async 關鍵字來定義了一個函數,那你就可以在這個函數內使用 await 關鍵字。當一個 async 函數被調用時,它會返回一個 Promise。當這個 async 函數返回一個值時,那個 Promise 就會被實現;而如果函數中拋出一個錯誤,那么 Promise 就會被拒絕。

        await 關鍵字可以被用來等待一個 Promise 被解決并返回其實現的值。如果傳給 await 的值不是一個 Promise,那它會把這個值轉化為一個已解決的 Promise。

        const rp = require('request-promise')
        async function main () {
         const result = await rp('https://google.com')
         const twenty = await 20
         
         // 睡個1秒鐘
         await new Promise (resolve => {
         setTimeout(resolve, 1000)
         })
         return result
        }
        main()
         .then(console.log)
         .catch(console.error)
        

        2 向 async 函數遷移

        如果你的 Node.js 應用已經在使用Promise,那你只需要把原先的鏈式調用改寫為對你的這些 Promise 進行 await。

        如果你的應用還在使用回調函數,那你應該以漸進的方式轉向使用 async 函數。你可以在開發一些新功能的時候使用這項新技術。當你必須調用一些舊有的代碼時,你可以簡單地把它們包裹成為 Promise 再用新的方式調用。

        要做到這一點,你可以使用內建的 util.promisify方法:

        const util = require('util')
        const {readFile} = require('fs')
        const readFileAsync = util.promisify(readFile)
        async function main () {
         const result = await readFileAsync('.gitignore')
         return result
        }
        main()
         .then(console.log)
         .catch(console.error)
        

        3 Async 函數的最佳實踐

        3.1 在 express 中使用 async 函數

        express 本來就支持 Promise,所以在 express 中使用 async 函數是比較簡單的:

        const express = require('express')
        const app = express()
        app.get('/', async (request, response) => {
         // 在這里等待 Promise
         // 如果你只是在等待一個單獨的 Promise,你其實可以直接將將它作為返回值返回,不需要使用 await 去等待。
         const result = await getContent()
         response.send(result)
        })
        app.listen(process.env.PORT)
        

        但正如 Keith Smith 所指出的,上面這個例子有一個嚴重的問題——如果 Promise 最終被拒絕,由于這里沒有進行錯誤處理,那這個 express 路由處理器就會被掛起。

        為了修正這個問題,你應該把你的異步處理器包裹在一個對錯誤進行處理的函數中:

        const awaitHandlerFactory = (middleware) => {
         return async (req, res, next) => {
         try {
         await middleware(req, res, next)
         } catch (err) {
         next(err)
         }
         }
        }
        // 然后這樣使用:
        app.get('/', awaitHandlerFactory(async (request, response) => {
         const result = await getContent()
         response.send(result)
        }))
        

        3.2 并行執行

        比如說你正在編寫這樣一個程序,一個操作需要兩個輸入,其中一個來自于數據庫,另一個則來自于一個外部服務:

        async function main () {
         const user = await Users.fetch(userId)
         const product = await Products.fetch(productId)
         await makePurchase(user, product)
        }
        

        在這個例子中,會發生什么呢?

        你的代碼會首先去獲取 user,
        然后獲取 product,
        最后再進行支付。
        如你所見,由于前兩步之間并沒有相互依賴關系,其實你完全可以將它們并行執行。這里,你應該使用 Promise.all 方法:

        async function main () {
         const [user, product] = await Promise.all([
         Users.fetch(userId),
         Products.fetch(productId)
         ])
         await makePurchase(user, product)
        }
        

        而有時候,你只需要其中最快被解決的 Promise 的返回值——這時,你可以使用 Promise.race 方法。

        3.3 錯誤處理

        考慮下面這個例子:

        async function main () {
         await new Promise((resolve, reject) => {
         reject(new Error('error'))
         })
        }
        main()
         .then(console.log)
        

        當執行這段代碼的時候,你會看到類似這樣的信息:

        (node:69738) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: error
        (node:69738) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

        在較新的 Node.js 版本中,如果 Promise 被拒絕且未得到處理,整個 Node.js 進程就會被中斷。因此必要的時候你應該使用 try-catch:

        const util = require('util')
        async function main () {
         try {
         await new Promise((resolve, reject) => {
         reject(new Error('💥'))
         })
         } catch (err) {
         // 在這里處理錯誤
         // 根據你的需要,有時候把錯誤直接再拋出也是可行的
         }
        }
        main()
         .then(console.log)
         .catch(console.error)
        

        可是,使用 try-catch 可能會隱藏掉一些重要的異常,比如像系統錯誤,你可能更想把它再拋出來。關于在什么情況下你應該將錯誤再次拋出,我強烈建議你去讀一下 Eran 的這篇文章。

        3.4 更為復雜的流程控制

        Caolan McMahon 的 async 是一個出現較早的用于 Node.js 中異步流程控制的庫。它提供了一些進行異步操作控制的幫助工具,比如:

        mapLimit,
        filterLimit,
        concatLimit,
        

        以及 priorityQueue。

        如果你不打算重新發明輪子,不想把同樣的邏輯自己再實現一遍,并且愿意信賴這個經過實踐檢驗的、每月下載量高達 5000 萬的庫,你可以結合 util.promisify 簡單地重用這些函數:

        const util = require('util')
        const async = require('async')
        const numbers = [
         1, 2, 3, 4, 5
        ]
        mapLimitAsync = util.promisify(async.mapLimit)
        async function main () {
         return await mapLimitAsync(numbers, 2, (number, done) => {
         setTimeout(function () {
         done(null, number * 2)
         }, 100)
         })
        }
        main()
         .then(console.log)
         .catch(console.error)
        

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Node.js 中使用 async 函數的方法

        Node.js 中使用 async 函數的方法:借助于新版 V8 引擎,Node.js 從 7.6 開始支持 async 函數特性。今年 10 月 31 日,Node.js 8 也開始成為新的長期支持版本,因此你完全可以放心大膽地在你的代碼中使用 async 函數了。在這邊文章里,我會簡要地介紹一下什么是 async 函數,以及它會如
        推薦度:
        標簽: 方法 中使用 函數
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲а∨天堂久久精品| 91香蕉成人免费网站| 国产美女无遮挡免费视频| 亚洲日本VA午夜在线电影| 色综合久久精品亚洲国产| 91免费精品国自产拍在线不卡| 亚洲国产成人精品不卡青青草原| 亚洲色精品aⅴ一区区三区| 精品国产日韩亚洲一区91| 成人爽a毛片免费| 亚洲欧洲日产国码av系列天堂| 国产免费高清69式视频在线观看| 国产亚洲精aa成人网站| 国产一级婬片A视频免费观看| 国产亚洲精品看片在线观看| 成人网站免费看黄A站视频| 亚洲精品天天影视综合网| 69精品免费视频| 国产精品亚洲精品青青青| a级黄色毛片免费播放视频| 亚洲成色WWW久久网站| 久久久久久久99精品免费| 噜噜噜亚洲色成人网站∨| 日韩免费精品视频| 亚洲成AV人影片在线观看| 亚洲电影日韩精品 | 亚洲人成自拍网站在线观看| 午夜视频在线观看免费完整版| 欧洲亚洲综合一区二区三区| 精品国产亚洲一区二区在线观看| 成人电影在线免费观看| 亚洲码一区二区三区| 午夜时刻免费入口| a毛片成人免费全部播放| 吃奶摸下高潮60分钟免费视频| 有色视频在线观看免费高清在线直播| 亚洲色婷婷六月亚洲婷婷6月| 日韩不卡免费视频| 新最免费影视大全在线播放| 亚洲精品在线网站| 又大又硬又爽免费视频|