ES6~ES14 之 async篇

在 JavaScript 中,async 是一个非常强大的关键字,用于声明异步函数,使得你能够更方便地处理异步操作。它与 await 配合使用,能够让异步代码看起来更像同步代码,从而简化异步编程的复杂性。

1. 基本用法

async 关键字用于声明一个函数,表示该函数返回一个 Promise 对象,并且可以在函数内部使用 await 来等待异步操作的结果。

// 声明一个 async 函数
async function fetchData() {
  return "Hello, World!";
}

// 调用 async 函数
fetchData().then(result => {
  console.log(result); // 输出: "Hello, World!"
});
  • async 声明的函数总是返回一个 Promise
  • 即使你在函数中直接返回一个值,JS 会自动将它包装成一个 Promise 对象。

2. 使用 await

await 只能在 async 函数内部使用,它会暂停执行直到 Promise 被解决(fulfilled)或拒绝(rejected)。

async function example() {
  console.log("Start");

  // 等待一个 Promise
  const result = await new Promise(resolve => {
    setTimeout(() => {
      resolve("Resolved after 2 seconds");
    }, 2000);
  });

  console.log(result);  // 输出: "Resolved after 2 seconds"
  console.log("End");
}

example();

在这个例子中,await 会暂停 example 函数的执行,直到 Promise 解决。代码看起来像是同步执行的,但它实际上是异步的。

3. 错误处理

使用 async/await 时,错误处理通常通过 try...catch 来实现,这比传统的 .catch() 方法更加直观。

async function fetchData() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts/1');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Error fetching data:', error);
  }
}

fetchData();

在这个例子中,try...catch 块用于捕获异步操作中的错误。如果 fetchjson() 发生异常,它会被捕捉并输出错误信息。

4. 并发处理

如果你有多个异步操作,并且希望并行处理这些操作,可以使用 Promise.all() 或者 Promise.allSettled(),它们可以等待所有异步任务完成,并返回它们的结果。

async function fetchData() {
  const promise1 = fetch('https://jsonplaceholder.typicode.com/posts/1');
  const promise2 = fetch('https://jsonplaceholder.typicode.com/posts/2');
  
  // 并行执行两个 fetch 请求
  const responses = await Promise.all([promise1, promise2]);

  const data1 = await responses[0].json();
  const data2 = await responses[1].json();

  console.log(data1, data2);
}

fetchData();

在这个例子中,Promise.all() 可以并行执行两个 fetch 请求,它们的结果会在所有请求完成后返回。

5. 异步迭代(for await...of

如果你需要在异步迭代器中使用 async/await,可以使用 for await...of 来循环异步结果。

async function fetchData() {
  const data = [
    Promise.resolve(1),
    Promise.resolve(2),
    Promise.resolve(3),
  ];

  for await (let num of data) {
    console.log(num);
  }
}

fetchData();

这里,for await...of 会等到每个 Promise 被解决之后再进行下一步操作。

总结

  • async 用于定义一个异步函数,返回一个 Promise
  • await 用于等待一个 Promise 完成,并返回其结果,或者捕获其错误。
  • 异步操作可以通过 try...catch 语句来捕获错误。
  • Promise.all() 可以用于并行处理多个异步操作。
  • for await...of 用于异步迭代器。

asyncawait 极大地提高了异步代码的可读性,能够让你像写同步代码一样写异步逻辑。这使得代码更简洁、可维护,并且更容易理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值