同步迭代(Symbol.iterator
、for of
)
一个 Object 要想是可迭代的,需要有 Symbol.iterator
属性
function buildIterator() { const timeList = [2000, 1000, 3000, 5000, 4000] return { next() { return { done: timeList.length === 0, value: timeList.shift() } } }}function testSync() { const begin = Date.now() console.log(Date.now() - begin, 'begin') const iteratableObj = { [Symbol.iterator]: buildIterator } for (let item of iteratableObj) { console.log(Date.now() - begin, item) } console.log(Date.now() - begin, 'end')}testSync()
运行结果:
异步迭代(Symbol.asyncIterator
、for await...of
)
一个 Object 要想是异步可迭代的,需要有 Symbol.asyncIterator
属性
实现如下功能:给定一个数组 [2000, 1000, 3000, 5000, 4000]
,按顺序按值对应的时长打印出来
function buildAsyncIterator() { const timeList = [2000, 1000, 3000, 5000, 4000] return { next() { return new Promise((resolve, reject) => { setTimeout(() => { resolve({ done: timeList.length === 0, value: timeList.shift() }) }, timeList[0]) }) } }}async function testAsync() { const begin = Date.now() console.log(Date.now() - begin, 'begin') const asyncIteratableObj = { [Symbol.asyncIterator]: buildAsyncIterator } for await (let item of asyncIteratableObj) { console.log(Date.now() - begin, item) } console.log(Date.now() - begin, 'end')}testAsync()
运行结果:
Promise(async await
、for of
)
当然不用异步迭代也能实现
function buildPromise(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(time) }, time) })}async function testPro() { const begin = Date.now() console.log(Date.now() - begin, 'begin') const timeList = [2000, 1000, 3000, 5000, 4000] for (item of timeList) { const time = await buildPromise(item) console.log(Date.now() - begin, time) } console.log(Date.now() - begin, 'end')}testPro()
运行结果:
参考
for-await-of
and synchronous iterables
Async iteration and generators
Asynchronous iteration
原文:https://juejin.cn/post/7099258513939464199