ES8 入门教程:新一代异步编程用 async/await

在 JavaScript 中,异步编程已经成为了一种必要的技能。在 ES6 中,我们可以通过 Promise 来实现异步操作,但是我们仍然需要手动处理回调函数、错误处理以及一些其他问题。ES8 引入了一种新的异步编程方式,async/await,可让我们编写更简洁、易读和可维护的异步代码。

async/await 初探

async 和 await 是 two keywords,是一种新的 language feature,实现了异步编程的一种新方式,在 ES7 中已经被标准化,并在 ES8 中成为了默认选项。

async 函数返回一个 Promise 对象,可以使用 then 方法进行异步操作。await 操作符可以在 async 函数中等待异步操作完成后返回结果值,而不必使用回调函数或者 then 方法。

以下是一个简单的例子:

async function asyncFn() {
  const result = await fetch('https://api.github.com/users/octocat');
  const data = await result.json();
  return data;
}

asyncFn().then(data => console.log(data));

这段代码调用了 fetch 方法获取 GitHub 上用户名为 octocat 的信息。fetch 方法返回一个 Promise 对象,在执行 async 函数体之前,await 停止函数的执行直到 Promise 对象返回 fulfilled 状态并返回数据,而不是 Promise 对象本身,因此我们可以将数据直接存储在一个 data 变量中,使代码易于阅读和理解。

实例详解

如何在需要执行多个异步操作的情况下使用 async/await?我们可以使用 Promise.all() 方法。

async function asyncFn() {
  const [user_response, repo_response] = await Promise.all([
    fetch('https://api.github.com/users/octocat'),
    fetch('https://api.github.com/users/octocat/repos')
  ]);
  const user_data = await user_response.json();
  const repo_data = await repo_response.json();
  return { user: user_data, repo: repo_data };
}

asyncFn().then(data => console.log(data));

首先,我们使用了 Promise.all() 方法来同时调用两个 API。在 Promise.all() 返回 resolve 时,我们可以使用解构的方式获取两个 API 的返回值,并分别存储在 user_response 和 repo_response 变量中。

接下来,我们使用 await 关键字获取 user_response 和 repo_response 的 json data,并将其存储在 user_data 和 repo_data 变量中。

最后,我们将 user_data 和 repo_data 组合成一个对象并通过 console.log() 打印出来。

异常处理

async/await 还提供了更方便的错误处理方式。在 async 函数中,我们可以使用 try 和 catch 语句捕捉异步函数中的错误。这种方式比在 Promise 对象中使用 catch 语句更加简单和直接。

async function asyncFn() {
  try {
    const response = await fetch('https://api.github.com/404');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.log(error);
  }
}

asyncFn();

在这个例子中,我们使用了 try 和 catch 语句来处理异常情况。如果 fetch 方法返回的状态码是 404, await 将会抛出一个异常,并将它存储在变量 error 中。我们直接使用 console.log() 方法输出这个异常,而不必将其传递给 catch() 方法中。

总结

async/await 是 ES8 中的一个新特性,提供了比 Promise 更加简单和易读的方式来处理异步操作。async 函数使用 Promise 来等待异步操作完成,await 关键字可以使用在只有 async 函数内的 Promise 对象前面。async/await 还提供了更加方便和直接的错误处理方式,来帮助我们编写更易于维护的异步代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a5ea75add4f0e0ffe7d2ce


纠错反馈