async 和 await 在干什么
任意一个名称都是有意义的,先从字面意思来理解。async 是“异步”的简写,而 await 的意思是等待。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 等待某个操作完成。
那么async/await到底是干嘛的呢?我们先来简单介绍一下。
async/await 是一种编写异步代码的新方法。之前异步代码的方案是回调和 promise。 async/await 是建立在 promise 的基础上。(对promise不熟悉的同学可以看一下这篇文章入门Promise的正确姿势) async/await 像 promise 一样,也是非阻塞的。 async/await 让异步代码看起来、表现起来更像同步代码。这正是其威力所在。async 起什么作用
这个问题的关键在于,async 函数是怎么处理它的返回值的!
我们当然希望它能直接通过 return 语句返回我们想要的值,但是如果真是这样,似乎就没 await 什么事了。所以,写段代码来试试,看它到底会返回什么:
<script> async function test(){ return 'hello async'; } let result = test(); console.log(result);</script>
看到输出就恍然大悟了——输出的是一个 Promise 对象。
Promise {<resolved>: "hello async"}
所以,async 函数返回的是一个 Promise 对象。async 函数(包含函数语句、函数表达式、Lambda表达式)会返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象。
async 函数返回的是一个 Promise 对象,所以在最外层不能用 await 获取其返回值的情况下,我们当然应该用原来的方式:then() 链来处理这个 Promise 对象,就像这样
async function test(){ return 'hello async'; } test().then((val) => { console.log(val); //hello async })
现在回过头来想下,如果 async 函数没有返回值,又该如何?很容易想到,它会返回 Promise.resolve(undefined)。
联想一下 Promise 的特点——无等待,所以在没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象,并且,绝不会阻塞后面的语句。这和普通返回 Promise 对象的函数并无二致。
那么下一个关键点就在于 await 关键字了。
await 到底在等啥
一般来说,都认为 await 是在等待一个 async 函数完成。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。
因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行。
新闻热点
疑难解答
图片精选