同步迭代(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