前言
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);}};
新闻热点
疑难解答
图片精选