微信登录

异步编程 - async/await - 异步函数的使用

Node.js 异步编程 - async/await - 异步函数的使用

在 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 会抛出该错误。

演示代码

简单示例

  1. // 模拟一个异步操作
  2. function fetchData() {
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. resolve('Data fetched successfully');
  6. }, 2000);
  7. });
  8. }
  9. // 异步函数
  10. async function getData() {
  11. try {
  12. const data = await fetchData();
  13. console.log(data);
  14. } catch (error) {
  15. console.error('Error:', error);
  16. }
  17. }
  18. // 调用异步函数
  19. getData();

在这个示例中,fetchData 函数返回一个 Promise,模拟了一个异步操作。getData 是一个异步函数,在函数内部使用 await 关键字等待 fetchData 函数返回的 Promise 被解决。如果 Promise 被解决,await 会返回解决值并赋值给 data 变量;如果 Promise 被拒绝,会进入 catch 块处理错误。

多个异步操作顺序执行

  1. function fetchData1() {
  2. return new Promise((resolve) => {
  3. setTimeout(() => {
  4. resolve('Data 1 fetched');
  5. }, 1000);
  6. });
  7. }
  8. function fetchData2() {
  9. return new Promise((resolve) => {
  10. setTimeout(() => {
  11. resolve('Data 2 fetched');
  12. }, 1500);
  13. });
  14. }
  15. async function getDataSequentially() {
  16. const data1 = await fetchData1();
  17. console.log(data1);
  18. const data2 = await fetchData2();
  19. console.log(data2);
  20. }
  21. getDataSequentially();

在这个示例中,getDataSequentially 函数按顺序执行了两个异步操作。await 关键字确保了 fetchData2 函数在 fetchData1 函数的 Promise 被解决后才会执行。

多个异步操作并行执行

  1. function fetchData1() {
  2. return new Promise((resolve) => {
  3. setTimeout(() => {
  4. resolve('Data 1 fetched');
  5. }, 1000);
  6. });
  7. }
  8. function fetchData2() {
  9. return new Promise((resolve) => {
  10. setTimeout(() => {
  11. resolve('Data 2 fetched');
  12. }, 1500);
  13. });
  14. }
  15. async function getDataInParallel() {
  16. const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
  17. console.log(data1);
  18. console.log(data2);
  19. }
  20. 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,我们可以编写更简洁、更易读的异步代码,让异步编程变得更加轻松和高效。