欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

什么是 async 函數(shù)

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

await 關(guān)鍵字可以被用來(lái)等待一個(gè) Promise 被解決并返回其實(shí)現(xiàn)的值。如果傳給 await 的值不是一個(gè) Promise,那它會(huì)把這個(gè)值轉(zhuǎn)化為一個(gè)已解決的 Promise。

const rp = require('request-promise')
async function main () {
 const result = await rp('https://google.com')
 const twenty = await 20
 // 睡個(gè)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)用改寫(xiě)為對(duì)你的這些 Promise 進(jìn)行 await。

如果你的應(yīng)用還在使用回調(diào)函數(shù),那你應(yīng)該以漸進(jìn)的方式轉(zhuǎn)向使用 async 函數(shù)。你可以在開(kāi)發(fā)一些新功能的時(shí)候使用這項(xiàng)新技術(shù)。當(dāng)你必須調(diào)用一些舊有的代碼時(shí),你可以簡(jiǎn)單地把它們包裹成為 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 本來(lái)就支持 Promise,所以在 express 中使用 async 函數(shù)是比較簡(jiǎn)單的:

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

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

為了修正這個(gè)問(wèn)題,你應(yīng)該把你的異步處理器包裹在一個(gè)對(duì)錯(cuò)誤進(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í)行

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

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

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

你的代碼會(huì)首先去獲取 user,

然后獲取 product,

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

如你所見(jiàn),由于前兩步之間并沒(méi)有相互依賴關(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)
}

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

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

相關(guān)文章

  • 舉例講解Node.js中的Writable對(duì)象

    舉例講解Node.js中的Writable對(duì)象

    這篇文章主要介紹了舉例講解Node.js中的Writable對(duì)象,是Node.js入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07
  • node中socket.io的事件使用詳解

    node中socket.io的事件使用詳解

    這篇文章主要介紹了node中socket.io的事件使用詳解,需要的朋友可以參考下
    2014-12-12
  • 讓nodeJS支持ES6的詞法----babel的安裝和使用方法

    讓nodeJS支持ES6的詞法----babel的安裝和使用方法

    這篇文章主要介紹了讓nodeJS支持ES6的詞法----babel的安裝和使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 快速了解Node中的Stream流是什么

    快速了解Node中的Stream流是什么

    今天小編就為大家分享一篇關(guān)于快速了解Node中的Stream流是什么,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • Node.js服務(wù)器開(kāi)啟Gzip壓縮教程

    Node.js服務(wù)器開(kāi)啟Gzip壓縮教程

    開(kāi)啟網(wǎng)站的 gzip 壓縮功能,通常可以高達(dá)70%,也就是說(shuō),如果你的網(wǎng)頁(yè)有30K,壓縮之后就變成9K, 對(duì)于大部分網(wǎng)站,顯然可以明顯提高瀏覽速度(注:需要瀏覽器支持)。
    2017-08-08
  • 配置nodejs環(huán)境的方法

    配置nodejs環(huán)境的方法

    本篇文章主要介紹了配置nodejs環(huán)境變量的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • 詳解Nodejs 通過(guò) fs.createWriteStream 保存文件

    詳解Nodejs 通過(guò) fs.createWriteStream 保存文件

    本篇文章主要介紹了Nodejs 通過(guò) fs.createWriteStream 保存文件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • node.js中的fs.createReadStream方法使用說(shuō)明

    node.js中的fs.createReadStream方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.createReadStream方法使用說(shuō)明,本文介紹了fs.createReadStream方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js使用net模塊創(chuàng)建服務(wù)器和客戶端示例【基于TCP協(xié)議】

    node.js使用net模塊創(chuàng)建服務(wù)器和客戶端示例【基于TCP協(xié)議】

    這篇文章主要介紹了node.js使用net模塊創(chuàng)建服務(wù)器和客戶端,結(jié)合實(shí)例形式分析了node.js使用net模塊實(shí)現(xiàn)TCP客戶端與服務(wù)器端通信的相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • 理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn)

    理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn)

    本篇文章主要介紹了理解nodejs的stream和pipe機(jī)制的原理和實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評(píng)論