js异步迭代器

wujiawen 发布于

【ES9】关于异步迭代器

普通for循环是同步迭代器,可依次访问实现了迭代器接口(iterator)的对象

js中的 String, Array, Map, Set都内置了可迭代对象,因为他们的原型对象都有一个Symbol.iterator方法

平时遇到的需要遍历的数据源大都是同步的,故迭代后的输出结果是按数据源的顺序输出的

但是,当遇到I/O流时,需要异步API进行访问,此时使用同步迭代器,会导致输出结果随机

ES9中引入了异步迭代器(Async Iterator)

可实现接口的串行调用

  • 异步迭代遍历

    1
    2
    3
    4
    // 使用 for await of 进行遍历
    for await (const item of promiseArray) {
    console.log(item)
    }
  • 同步迭代器实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Symbol.iterator]: () => {
    const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    return {
    next: () => ({
    done: items.length === 0,
    value: items.shift
    })
    }
    }
  • 异步迭代器实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Symbol.asyncIterator]: () => {
    const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
    return {
    next: () => Promise.resolve({
    done: items.length === 0,
    value: items.shift
    })
    }
    }