
在 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,我们可以编写更简洁、更易读的异步代码,让异步编程变得更加轻松和高效。