javascript 如何将异步迭代器转换为数组?

ymdaylpp  于 2023-06-28  发布在  Java
关注(0)|答案(4)|浏览(154)

假设我有一个异步生成器:

async function* generateItems() {
    // ...
}

将所有结果迭代到数组中最简单的方法是什么?我尝试了以下方法:

// This does not work
const allItems = Array.from(generateItems());
// This works but is verbose
const allItems = [];
for await (const item of generateItems()) {
    allItems.push(item);
}

(我知道这在生产应用程序中可能是不好的做法,但它对于原型设计很方便。)

nhjlsmyf

nhjlsmyf1#

这里有一个简单的函数,可以将异步迭代器转换为数组,而无需包含整个包。

async function toArray(asyncIterator){ 
    const arr=[]; 
    for await(const i of asyncIterator) arr.push(i); 
    return arr;
}
axzmvihb

axzmvihb2#

你的解决方案是我唯一知道的。下面是一个TypeScript函数:

async function gen2array<T>(gen: AsyncIterable<T>): Promise<T[]> {
    const out: T[] = []
    for await(const x of gen) {
        out.push(x)
    }
    return out
}

TypeScript Playground

zazmityj

zazmityj3#

如果有人仍然在寻找解决方案,从ES22开始,您可以使用新的Array.fromAsync()静态方法。
这将返回一个promise,其实现值是一个新的Array示例。
ES propsal的例子:

async function* f() {
  for (let i = 0; i < 4; i++) yield i;
}

// Resolves to [0, 1, 2, 3].
await Array.fromAsync(f());
  • 注意:浏览器兼容性目前不是很好...

参考:MDN TC39

8ulbf1ek

8ulbf1ek4#

看起来像async-iterator-to-array npm库这样做:
安装

npm install --save async-iterator-to-array

用途

const toArray = require('async-iterator-to-array')

async function * iterator (values) {
  for (let i = 0; i < values.length; i++) {
    yield values[i]
  }
}

const arr = await toArray(iterator([0, 1, 2, 3, 4]))

console.info(arr) // 0, 1, 2, 3, 4

相关问题