nodejs中async的用法是什麼
在nodejs中,async關鍵字可以用來定義一個函數,當async函數被呼叫時,會傳回一個Promise,當async函數傳回一個值時,這個Promise就會被實現,當函數拋出一個錯誤時,Promise就會被拒絕。
本教學操作環境:windows10系統、nodejs 12.19.0版,DELL G3電腦。
nodejs中async的用法是什麼
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) 無題 列主義: 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('
更多node相關知識,請訪問:
nodejs 教學以上是nodejs中async的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Node.js 是一種伺服器端 JavaScript 執行時,而 Vue.js 是一個客戶端 JavaScript 框架,用於建立互動式使用者介面。 Node.js 用於伺服器端開發,如後端服務 API 開發和資料處理,而 Vue.js 用於用戶端開發,如單一頁面應用程式和響應式使用者介面。

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。
