ES8(ES2017)引入了 async
函数和 await
关键字。await
关键字可用于 async
修饰的异步函数或者一个 Promise
对象,而异步函数本质上也就是一个返回 Promise
对象的语法糖。
ES9(ES2018) 引入了新的 for await...of
语句,可用来遍历异步可迭代对象。异步可迭代对象通过 Symbol.asyncIterator
符号来指定默认的异步迭代器,如果一个对象设置了这个属性,它就是异步可迭代对象。和同步迭代器一样,异步迭代器同样包含一个 next()
方法,该方法返回一个对象,包含 done
和 value
两个属性,前者表示循环是否结束,后者是当前循环的返回值。
如下代码实现一个异步可迭代定时器。该迭代器每隔一秒输出当前的计数器值,迭代 100 次后中止。
const asyncTimerIterator = {
[Symbol.asyncIterator]() {
var count = 0
return {
next() {
count ++
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
done: count > 100,
value: count
})
}, 1000)
})
}
}
}
}
for await (let count of asyncTimerIterator) {
console.log(count)
}
回调 resolve
函数表示执行成功,参数即是 await
得到的返回值;回调 reject
函数表示执行失败,参数即 await
抛出的异常,可以用 try...catch
语句来捕获。