【ES9】关于异步迭代器
普通for循环是同步迭代器,可依次访问实现了迭代器接口(iterator)的对象
js中的 String, Array, Map, Set都内置了可迭代对象,因为他们的原型对象都有一个Symbol.iterator方法
平时遇到的需要遍历的数据源大都是同步的,故迭代后的输出结果是按数据源的顺序输出的
但是,当遇到I/O流时,需要异步API进行访问,此时使用同步迭代器,会导致输出结果随机
ES9中引入了异步迭代器(Async Iterator)
可实现接口的串行调用
异步迭代遍历
1
2
3
4// 使用 for await of 进行遍历
for await (const item of promiseArray) {
console.log(item)
}同步迭代器实现
1
2
3
4
5
6
7
8
9[Symbol.iterator]: () => {
const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
return {
next: () => ({
done: items.length === 0,
value: items.shift
})
}
}异步迭代器实现
1
2
3
4
5
6
7
8
9[Symbol.asyncIterator]: () => {
const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
return {
next: () => Promise.resolve({
done: items.length === 0,
value: items.shift
})
}
}