原理
async函数是对generator函数和自动执行器做了一层封装,返回一个promise。因为generator函数会返回1个迭代器对象,循环调用这个遍历器对象的next方法,上一个next的value作为下一个next函数的参数传入,如果next返回值done是true说明已经遍历完,最终返回1个promise。
async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await, 是语法糖。
进一步说,async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。
1 | // ruanyifeng 版本 |
1 | // 个人版本 |
关于genetator 函数
next()、throw()、return()这三个方法本质上是同一件事,可以放在一起理解。它们的作用都是让 Generator 函数恢复执行,并且使用不同的语句替换yield表达式。
- next()是将yield表达式替换成一个值。
next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值。 - throw()是将yield表达式替换成一个throw语句
Generator 函数 返回的遍历器对象,都有一个throw方法,可以在函数体外抛出错误,然后在 Generator 函数体内捕获 - return()是将yield表达式替换成一个return语句
Generator 函数 返回的遍历器对象,还有一个return方法,可以返回给定的值,并且终结遍历 Generator 函数。
注意点
- await只能用在async中,否则报错
- await等待的promise如果被reject, 异常会被抛出,需加try..catch
- 异步操作不存在依赖的情况下,同时触发异步,减少不必要等待时间
语法
[return_value] = await expression
表达式
一个 Promise 对象或者任何要等待的值。
返回值
返回 Promise 对象的处理结果。如果等待的不是 Promise 对象,则返回该值本身。
demo
await返回值
await会暂停当前 async function 的执行,等待promise处理完成,将promise resolve的结果作为返回值,如果promise异常,则抛出异常(区别于promise内部错误不反应到外部,只能通过catch捕获),如果不是promise是个普通值,则直接返回普通值
1 | async function f1(){ |
async函数会返回promise(例子见上)
当调用一个 async 函数时,会返回一个 Promise 对象。当这个 async 函数返回一个值时,Promise 的 resolve 方法会负责传递这个值;当 async 函数抛出异常时,Promise 的 reject 方法也会传递这个异常值。
当不存在异步依赖关系
同时触发异步,减少不必要等待时间1
2
3
4
5
6
7
8// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;