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

时间:2019-11-02 04:57:15

标签: javascript async-await

鉴于我有一个异步生成器:

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);
}

(我知道这在Production应用程序中可能是不好的做法,但对于原型制作很方便。)

3 个答案:

答案 0 :(得分:1)

您所知道的是唯一的解决方案。这是TypeScript函数:

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

答案 1 :(得分:1)

这是一个简单的函数,可以将异步迭代器转换为数组,而不必包含整个程序包。

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

答案 2 :(得分:0)

就像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