微信登录

异步编程 - 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 被解决,然后将结果解构赋值给 data1data2 变量。

总结

概念 描述
async 函数 使用 async 关键字声明的函数,总是返回一个 Promise
await 关键字 只能在 async 函数内部使用,暂停函数执行,等待 Promise 被解决或拒绝
顺序执行 使用 await 依次等待每个异步操作完成
并行执行 使用 Promise.all 并行执行多个异步操作,再使用 await 等待所有操作完成

注意事项

  • await 关键字只能在 async 函数内部使用,如果在普通函数中使用会导致语法错误。
  • async 函数内部抛出的错误会被包装成一个已拒绝的 Promise,可以使用 try...catch 块来捕获和处理错误。

通过使用 async/await,我们可以编写更简洁、更易读的异步代码,让异步编程变得更加轻松和高效。

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