首页 > 语言 > JavaScript > 正文

Async/Await替代Promise的6个理由

2024-05-06 15:38:01
字体:
来源:转载
供稿:网友

前言

Node.js 7.6 已经支持 async/await 了,如果你还没有试过,这篇博客将告诉你为什么要用它。

Async/Await 简介

对于从未听说过 async/await 的朋友,下面是简介:

async/await 是写异步代码的新方式,以前的方法有回调函数和Promise。 async/await 是基于 Promise 实现的,它不能用于普通的回调函数。 async/await 与 Promise 一样,是非阻塞的。 async/await 使得异步代码看起来像同步代码,这正是它的魔力所在。

Async/Await 语法

示例中,getJSON 函数返回一个 promise,这个 promise 成功 resolve 时会返回一个 json 对象。我们只是调用这个函数,打印返回的 JSON 对象,然后返回”done”。

使用 Promise 是这样的:

const makeRequest = () =>getJSON().then(data => {console.log(data);return "done";});makeRequest();

使用 Async/Await 是这样的:

const makeRequest = async () => {console.log(await getJSON());return "done";};makeRequest();

它们有一些细微不同:

函数前面多了一个 async 关键字。await 关键字只能用在 async 定义的函数内。async 函数会隐式地返回一个 promise,该 promise 的 reosolve 值就是函数 return 的值。(示例中 reosolve 值就是字符串”done”)

第 1 点暗示我们不能在最外层代码中使用 await,因为不在 async 函数内。

// 不能在最外层代码中使用awaitawait makeRequest();// 这是会出事情的makeRequest().then(result => {// 代码});

await getJSON()表示 console.log 会等到 getJSON 的 promise 成功 reosolve 之后再执行。

为什么 Async/Await 更好?

1. 简洁

由示例可知,使用 Async/Await 明显节约了不少代码。我们不需要写.then,不需要写匿名函数处理 Promise 的 resolve 值,也不需要定义多余的 data 变量,还避免了嵌套代码。这些小的优点会迅速累计起来,这在之后的代码示例中会更加明显。

2. 错误处理

Async/Await 让 try/catch 可以同时处理同步和异步错误。在下面的 promise 示例中,try/catch 不能处理 JSON.parse 的错误,因为它在 Promise 中。我们需要使用.catch,这样错误处理代码非常冗余。并且,在我们的实际生产代码会更加复杂。

const makeRequest = () => {try {getJSON().then(result => {// JSON.parse可能会出错const data = JSON.parse(result);console.log(data);});// 取消注释,处理异步代码的错误// .catch((err) => {// console.log(err)// })} catch (err) {console.log(err);}};

使用 async/await 的话,catch 能处理 JSON.parse 错误:

const makeRequest = async () => {try {// this parse may failconst data = JSON.parse(await getJSON());console.log(data);} catch (err) {console.log(err);}};            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选