最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在Node.js中使用async函數(shù)的方法詳解

 更新時間:2022年12月19日 14:27:36   作者:尤金前端  
這篇文章主要為大家介紹了如何在Node.js中使用async函數(shù)的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

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

什么是 async 函數(shù)

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

await 關(guān)鍵字可以被用來等待一個 Promise 被解決并返回其實(shí)現(xiàn)的值。如果傳給 await 的值不是一個 Promise,那它會把這個值轉(zhuǎn)化為一個已解決的 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)

向 async 函數(shù)遷移

如果你的 Node.js 應(yīng)用已經(jīng)在使用Promise,那你只需要把原先的鏈?zhǔn)秸{(diào)用改寫為對你的這些 Promise 進(jìn)行 await。

如果你的應(yīng)用還在使用回調(diào)函數(shù),那你應(yīng)該以漸進(jìn)的方式轉(zhuǎn)向使用 async 函數(shù)。你可以在開發(fā)一些新功能的時候使用這項(xiàng)新技術(shù)。當(dāng)你必須調(diào)用一些舊有的代碼時,你可以簡單地把它們包裹成為 Promise 再用新的方式調(diào)用。

要做到這一點(diǎn),你可以使用內(nèi)建的 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 函數(shù)的最佳實(shí)踐

在 express 中使用 async 函數(shù)

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

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

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

為了修正這個問題,你應(yīng)該把你的異步處理器包裹在一個對錯誤進(jìn)行處理的函數(shù)中:

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)
}))

并行執(zhí)行

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

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

在這個例子中,會發(fā)生什么呢?

你的代碼會首先去獲取 user,

然后獲取 product,

最后再進(jìn)行支付。

如你所見,由于前兩步之間并沒有相互依賴關(guān)系,其實(shí)你完全可以將它們并行執(zhí)行。這里,你應(yīng)該使用 Promise.all 方法:

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

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

以上就是如何在Node.js中使用async函數(shù)的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Node.js使用async函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • npm報版本與node.js不匹配問題及解決

    npm報版本與node.js不匹配問題及解決

    這篇文章主要介紹了npm報版本與node.js不匹配問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 使用node.js 獲取客戶端信息代碼分享

    使用node.js 獲取客戶端信息代碼分享

    本文給大家分享一段使用node.js 獲取客戶端信息的代碼,非常的簡潔,推薦給大家。
    2014-11-11
  • Node.js中出現(xiàn)未捕獲異常的處理方法

    Node.js中出現(xiàn)未捕獲異常的處理方法

    這篇文章主要給大家介紹了關(guān)于Node.js中出現(xiàn)未捕獲異常的處理方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 在Node.js應(yīng)用程序中處理大數(shù)的操作指南

    在Node.js應(yīng)用程序中處理大數(shù)的操作指南

    在JavaScript生態(tài)系統(tǒng)中,你可以使用BigInt來處理大整數(shù),但是,你也可以使用具有類似于BigInt功能的第三方庫,本文將是使用BigInt和提供類似功能的流行庫管理大數(shù)的完整指南,我們還將比較第三方庫的用例、優(yōu)勢和劣勢
    2023-06-06
  • 淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本

    淺談node如何優(yōu)雅地獲取mac系統(tǒng)版本

    這篇文章主要和大家聊聊node如何優(yōu)雅地獲取mac系統(tǒng)版本,文中有詳細(xì)的代碼示例和流程步驟,對我們學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • nodejs+axios爬取html出現(xiàn)中文亂碼并解決示例

    nodejs+axios爬取html出現(xiàn)中文亂碼并解決示例

    這篇文章主要為大家介紹了nodejs+axios爬取html出現(xiàn)中文亂碼示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • 吐槽一下我所了解的Node.js

    吐槽一下我所了解的Node.js

    用了一年多 Node.js, 現(xiàn)在已經(jīng)是 Node.js 的腦殘粉了,這篇日志比較雜,算是我對 Node.js 方方面面的一個集中吐槽。
    2014-10-10
  • 在nodeJs中如何修改json文件中的數(shù)據(jù)

    在nodeJs中如何修改json文件中的數(shù)據(jù)

    這篇文章主要介紹了在nodeJs中如何修改json文件中的數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Node express 官方示例cors跨域解析

    Node express 官方示例cors跨域解析

    這篇文章主要為大家介紹了Node express 官方示例cors跨域解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 深入解析koa之異步回調(diào)處理

    深入解析koa之異步回調(diào)處理

    這篇文章主要介紹了深入解析koa之異步回調(diào)處理,我們研究一下koa當(dāng)中異步回調(diào)同步化寫法的原理,同樣的,我們也會實(shí)現(xiàn)一個管理函數(shù),是的我們能夠通過同步化的寫法來寫異步回調(diào)函數(shù)。,需要的朋友可以參考下
    2019-06-06

最新評論

桦川县| 阿图什市| 瑞昌市| 玉屏| 奇台县| 法库县| 壶关县| 花莲县| 灵丘县| 油尖旺区| 麦盖提县| 嘉荫县| 上饶县| 客服| 巴东县| 龙陵县| 白玉县| 建湖县| 海兴县| 桑植县| 怀来县| 双鸭山市| 公主岭市| 鄯善县| 招远市| 黄平县| 柳林县| 正镶白旗| 海盐县| 东乌珠穆沁旗| 安陆市| 宁陵县| 桓仁| 四子王旗| 东乌珠穆沁旗| 大关县| 米泉市| 渝中区| 乐亭县| 天柱县| 沾化县|