在 Node.js 中,异步编程是非常重要的一部分,它能够让程序在处理耗时操作时不会阻塞后续代码的执行,从而提高程序的性能和响应能力。async/await
是 ES2017 引入的一种异步编程语法糖,它建立在 Promise 的基础之上,使得异步代码看起来更像同步代码,大大提高了代码的可读性和可维护性。
async
函数)async
函数是使用 async
关键字声明的函数,它总是返回一个 Promise。如果函数内部返回一个值,这个值会被包装成一个已解决(resolved)的 Promise;如果函数内部抛出一个错误,这个错误会被包装成一个已拒绝(rejected)的 Promise。
await
关键字await
关键字只能在 async
函数内部使用,它可以暂停 async
函数的执行,直到 Promise 被解决(resolved)或被拒绝(rejected)。如果 Promise 被解决,await
会返回 Promise 的解决值;如果 Promise 被拒绝,await
会抛出该错误。
// 模拟一个异步操作
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched successfully');
}, 2000);
});
}
// 异步函数
async function getData() {
try {
const data = await fetchData();
console.log(data);
} catch (error) {
console.error('Error:', error);
}
}
// 调用异步函数
getData();
在这个示例中,fetchData
函数返回一个 Promise,模拟了一个异步操作。getData
是一个异步函数,在函数内部使用 await
关键字等待 fetchData
函数返回的 Promise 被解决。如果 Promise 被解决,await
会返回解决值并赋值给 data
变量;如果 Promise 被拒绝,会进入 catch
块处理错误。
function fetchData1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 1 fetched');
}, 1000);
});
}
function fetchData2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 2 fetched');
}, 1500);
});
}
async function getDataSequentially() {
const data1 = await fetchData1();
console.log(data1);
const data2 = await fetchData2();
console.log(data2);
}
getDataSequentially();
在这个示例中,getDataSequentially
函数按顺序执行了两个异步操作。await
关键字确保了 fetchData2
函数在 fetchData1
函数的 Promise 被解决后才会执行。
function fetchData1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 1 fetched');
}, 1000);
});
}
function fetchData2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve('Data 2 fetched');
}, 1500);
});
}
async function getDataInParallel() {
const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
console.log(data1);
console.log(data2);
}
getDataInParallel();
在这个示例中,getDataInParallel
函数使用 Promise.all
方法并行执行了两个异步操作。await
关键字等待 Promise.all
返回的 Promise 被解决,然后将结果解构赋值给 data1
和 data2
变量。
概念 | 描述 |
---|---|
async 函数 |
使用 async 关键字声明的函数,总是返回一个 Promise |
await 关键字 |
只能在 async 函数内部使用,暂停函数执行,等待 Promise 被解决或拒绝 |
顺序执行 | 使用 await 依次等待每个异步操作完成 |
并行执行 | 使用 Promise.all 并行执行多个异步操作,再使用 await 等待所有操作完成 |
await
关键字只能在 async
函数内部使用,如果在普通函数中使用会导致语法错误。async
函数内部抛出的错误会被包装成一个已拒绝的 Promise,可以使用 try...catch
块来捕获和处理错误。通过使用 async/await
,我们可以编写更简洁、更易读的异步代码,让异步编程变得更加轻松和高效。