简单理解JavaScript里async/await
在JavaScript中,async/await都是非常棒的特性,也都是非常甜的语法糖,而JavaScript的async/await实现,也离不开promise。
1.async和await做了什么?
从字面看,async是"异步"的意思,而await可以认为是async wait的简写。那我们是不是可以理解为async用于申明一个function是异步的,而await用于等待一个异步方法执行完成。
2.async起什么作用?
<script>
async function asyncTest() {
return "hello async"
}
console.log(asyncTest());
</script>
由此可知async函数返回的是一个promise对象,如果在函数中return一个直接量,async会把这个直接量通过Promise.resolve()封装成Promise对象。Promise.resolve(X)可以看作是new Promise(resolve=>resolve(x))的简写,可用于快速封装成Promise实例。
async函数返回的是一个promise对象,可以用then()链来处理这个Promise对象。
3.await到底等什么?
一般都认为await是在等待一个async函数的完成,不过按语法说明,await等待的是一个表达式,表达式的计算结果是Promise对象或其他值。所以这里await等待的是async函数的返回值。
4.await等到了返回值之后做什么?
await等到了一个Promise对象,await是个运算符,用于组成表达式,await表达式的运算结果取决于它等的东西。
等到Promise对象,它会等Promise对象resolve,然后等到resolve的值作为await表达式的运算结果。
5.总结:
async会将它后面的函数的返回值封装成一个Promise对象,而await会等待这个Promise完成,并将resolve的结果返回出来。
async/await的优势在于处理then链,单一的Promise链并不能发现async和await的优势,但是如果需要处理多个Promise组成的then链的时候,优势就体现出来了,Promise通过then链来解决多层回调的问题,现在又用async/await来进一步优化它(Promsie参数传递太麻烦)。