一篇文章弄懂Node.js和Javascript中的async和await
前言
在 JavaScript 和 Node.js 中,async/await 主要用于處理 異步操作。雖然它們都基于 Promise,但在 Node.js 中,async/await 往往用于處理 I/O 操作、文件操作、數(shù)據(jù)庫查詢等,而在 瀏覽器中的 JavaScript,它更多應(yīng)用于 AJAX 請求、DOM 操作等場景。
1. 在 JavaScript 中的應(yīng)用(瀏覽器):
在瀏覽器端,async/await 主要用來處理 異步操作,如 AJAX 請求、獲取外部數(shù)據(jù)、處理異步事件 等。以下是幾個常見的應(yīng)用場景:
示例 1:使用async/await發(fā)送異步請求
假設(shè)我們想要通過 fetch() 請求獲取數(shù)據(jù),使用 async/await 可以讓代碼看起來更簡潔。
async function fetchData() {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const data = await response.json();
console.log('數(shù)據(jù)獲取成功:', data);
} catch (error) {
console.log('請求失敗:', error);
}
}
fetchData();
代碼解析:
await fetch():等待fetch()請求的響應(yīng)。由于fetch()返回一個Promise,使用await關(guān)鍵字會暫停函數(shù)執(zhí)行,直到Promise解析完畢。await response.json():當(dāng)fetch()請求成功返回時,使用await等待將響應(yīng)轉(zhuǎn)換為 JSON 格式的數(shù)據(jù)。try/catch:用于捕獲請求過程中發(fā)生的任何錯誤。
示例 2:處理多個異步操作并行執(zhí)行
有時你需要同時執(zhí)行多個異步操作,async/await 使得并行操作的處理變得更加簡單。使用 Promise.all() 可以并行執(zhí)行多個異步任務(wù)。
async function fetchMultipleData() {
try {
const [users, posts] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json()),
fetch('https://jsonplaceholder.typicode.com/posts').then(res => res.json())
]);
console.log('用戶數(shù)據(jù):', users);
console.log('帖子數(shù)據(jù):', posts);
} catch (error) {
console.log('發(fā)生錯誤:', error);
}
}
fetchMultipleData();
代碼解析:
Promise.all()用來并行執(zhí)行多個異步請求,await確保所有請求完成后,才繼續(xù)執(zhí)行后續(xù)代碼。
2. 在 Node.js 中的應(yīng)用:
在 Node.js 中,async/await 主要用于處理文件操作、數(shù)據(jù)庫查詢、HTTP 請求等異步任務(wù),尤其是對 I/O 操作 的處理。在 Node.js 中,很多核心模塊(如 fs、http 等)原本使用回調(diào)函數(shù)來處理異步任務(wù),而 async/await 使得異步操作更易于管理和理解。
示例 1:文件操作
使用 Node.js 的 fs 模塊進行異步文件操作時,可以使用 async/await 簡化代碼,避免回調(diào)地獄。
const fs = require('fs').promises; // 使用 fs.promises API,返回的已經(jīng)是 Promise
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf-8');
console.log('文件內(nèi)容:', data);
} catch (error) {
console.log('讀取文件失敗:', error);
}
}
readFile();
代碼解析:
fs.readFile返回一個Promise,通過await可以暫停函數(shù)執(zhí)行,等待文件讀取完成后再繼續(xù)執(zhí)行后續(xù)代碼。try/catch捕獲文件讀取過程中的任何錯誤。
示例 2:數(shù)據(jù)庫操作(使用mongoose)
在使用 MongoDB 數(shù)據(jù)庫時,async/await 非常適合處理數(shù)據(jù)庫的異步操作。假設(shè)我們使用 mongoose(一個 MongoDB 的 ODM)來查詢數(shù)據(jù)庫:
const mongoose = require('mongoose');
const User = mongoose.model('User', new mongoose.Schema({ name: String }));
async function getUsers() {
try {
const users = await User.find(); // 使用 async/await 獲取所有用戶
console.log('用戶列表:', users);
} catch (error) {
console.log('數(shù)據(jù)庫查詢失敗:', error);
}
}
getUsers();
代碼解析:
User.find()是一個異步操作,返回一個Promise,通過await等待其完成,并將結(jié)果傳遞給users變量。
示例 3:HTTP 請求處理
Node.js 用 http 模塊處理異步 HTTP 請求時,可以結(jié)合 async/await 來提高代碼可讀性。
const http = require('http');
async function requestHandler(req, res) {
try {
const data = await fetch('https://jsonplaceholder.typicode.com/posts');
const jsonData = await data.json();
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(jsonData));
} catch (error) {
res.writeHead(500, { 'Content-Type': 'text/plain' });
res.end('發(fā)生錯誤');
}
}
const server = http.createServer(requestHandler);
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
代碼解析:
- 通過
await等待外部 API 請求的響應(yīng),收到數(shù)據(jù)后進行處理并返回給客戶端。
總結(jié):
async/await的應(yīng)用:
瀏覽器端:
async/await用于處理如 AJAX 請求、API 請求 和 DOM 操作 等異步任務(wù)。- 使得異步代碼更加簡潔和易于理解。
Node.js 中:
async/await使得文件 I/O 操作、數(shù)據(jù)庫操作、HTTP 請求 等異步任務(wù)的代碼更加直觀。- 它大大簡化了回調(diào)地獄,使得處理異步操作更清晰。
async/await與Promise:
async/await是對Promise的語法糖,提供了更好的錯誤處理機制(try/catch),以及更簡潔的代碼結(jié)構(gòu)。- 通過
async/await,異步代碼的書寫接近同步代碼,增加了可讀性和可維護性。
到此這篇關(guān)于Node.js和Javascript中async和await的文章就介紹到這了,更多相關(guān)Node.js和JS中async和await內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 詳解Node.js中的Async和Await函數(shù)
- Node.js中的async?和?await?關(guān)鍵字微任務(wù)和宏任務(wù)
- Node.js如何對SQLite的async/await封裝詳解
- Node.js中Express框架使用axios同步請求(async+await)實現(xiàn)方法
- node.js中 mysql 增刪改查操作及async,await處理實例分析
- 使用Node.js的async和await進行異步編程
- Node.js 中正確使用 async/await 與 Promise 對象配合(操作方法)
- 詳解如何在Node.js中正確處理async/await及數(shù)組迭代
相關(guān)文章
Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去實例
這篇文章主要介紹了Nodejs進階:如何將圖片轉(zhuǎn)成datauri嵌入到網(wǎng)頁中去,有興趣的可以了解一下。2016-11-11
使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)
Excel.js是一個強大的JavaScript庫,它提供了方法處理Excel文件,例如創(chuàng)建和編輯工作簿、讀取和寫入數(shù)據(jù)、處理行和列、設(shè)置樣式、導(dǎo)入和導(dǎo)出數(shù)據(jù)等,本文介紹使用ExcelJS快速處理Node.js爬蟲數(shù)據(jù)的方法,一起看看吧2024-01-01
Nginx設(shè)置為Node.js的前端服務(wù)器方法總結(jié)
在本篇文章中小編給大家分享了關(guān)于Nginx設(shè)置為Node.js的前端服務(wù)器的方法和實例,需要的朋友們學(xué)習(xí)下。2019-03-03
詳解NodeJs項目 CentOs linux服務(wù)器線上部署
這篇文章主要介紹了NodeJs項目 CentOs linux服務(wù)器線上部署,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
node.js Sequelize實現(xiàn)單實例字段或批量自增、自減
Sequelize 可以實現(xiàn)針對單個實例的一或多個字段的自增、自減操作,也可以對符合條件的數(shù)據(jù)進行批量的自增、自減操作。單個實例字段的自增、自減可以利用Instance的相應(yīng)方法實現(xiàn),而批量自增、自減則需要借助sequelize提供的字面量方法實現(xiàn)。下面來看看詳細的介紹吧。2016-12-12
nodejs使用redis作為緩存介質(zhì)實現(xiàn)的封裝緩存類示例
這篇文章主要介紹了nodejs使用redis作為緩存介質(zhì)實現(xiàn)的封裝緩存類,涉及nodejs操作redis進行緩存設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Node.js進行文件讀取與復(fù)制的系統(tǒng)總結(jié)
這篇文章主要為大家詳細介紹了Node.js中文件讀取與復(fù)制相關(guān)內(nèi)容的系統(tǒng)總結(jié),包括 同步讀取,異步讀取,復(fù)制操作等,有需要的小伙伴可以跟隨小編一起了解下2025-04-04

