异步迭代器概念
在 ES10 中,异步迭代器 (AsyncIterator) 是实现了一个[Symbol.asyncIterator]
的对象,它可以在迭代过程中返回 Promise 对象,使得迭代过程变为异步的。
实现 AsyncIterator
通过定义一个具有[Symbol.asyncIterator]
方法的对象,我们就可以实现一个 AsyncIterator。
const AsyncIterableExample = { async *[Symbol.asyncIterator]() { yield new Promise((resolve) => setTimeout(() => resolve(1), 500)) yield new Promise((resolve) => setTimeout(() => resolve(2), 200)) yield new Promise((resolve) => setTimeout(() => resolve(3), 300)) }, }
在上面的代码中,我们定义了一个包含三个 Promise 的 AsyncIterableExample 对象,通过 yield 返回每个 Promise 的结果。
使用 AsyncIterator
for await...of
可以通过 for await...of 来消费一个 AsyncIterator。
(async function () { for await (const value of AsyncIterableExample) { console.log(value) } })()
在代码中,我们通过 for await...of 来消费 AsyncIterableExample 对象,并通过 console.log 输出结果。
Promise.all 加上 map
我们也可以将 AsyncIterator 对象通过 Promise.all 加上 map 方法来消费。
(async function() { console.log(await Promise.all((await AsyncIterableExample[Symbol.asyncIterator]()).map(async p => await p))); })();
在这个例子中,我们将 AsyncIterator 对象通过(await AsyncIterableExampleSymbol.asyncIterator)获取,然后进行map操作,每个 Promise 对象再通过 async/await来获取结果,再通过 Promise.all 来返回最终结果。
结论
通过 AsyncIterator,我们可以通过 几种不同的方法来消费异步迭代对象,使得其更加灵活可用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6711d68dad1e889fe2012159