最新消息:看到那些跳动的图片、文字了吗?点击点击 O(∩_∩)O~~

异步迭代器 for-await-of

深夜食堂 onlyling 3103浏览

查看原文 ES2018 新特征之:异步迭代器 for-await-of

迭代器

一个简单的迭代器

function makeIterator(array) {
  let nextIndex = 0;  // 初始索引

  // 返回一个迭代器对象,对象的属性是一个 next 方法
  return {
    next: function() {
      if (nextIndex < array.length) {
        // 当没有到达末尾时,返回当前值,并把索引加1
        return { value: array[nextIndex++], done: false };
      }

      // 到达末尾,done 属性为 true
      return {done: true};
    }
  };
}

一旦初始化,next() 方法可以用来依次访问对象中的键值:

const it = makeIterator(['j', 'u', 's', 't']);
it.next().value;  // j
it.next().value;  // u
it.next().value;  // s
it.next().value;  // t
it.next().value;  // undefined
it.next().done;   // true
it.next().value;  // undefined

可迭代对象

一个定义了迭代行为的对象,比如在 for...of 中循环了哪些值。为了实现可迭代,一个对象必须实现 @@iterator 方法,这意味着这个对象(或其原型链中的一个对象)必须具有带 Symbol.iterator 键的属性:

StringArrayTypedArrayMapSet 都内置可迭代对象,因为它们的原型对象都有一个 Symbol.iterator 方法。

以下方式就可以实现一个可迭代的对象。

const justjavac = {
  [Symbol.iterator]: () => {
    const items = [`j`, `u`, `s`, `t`, `j`, `a`, `v`, `a`, `c`];
    return {
      next: () => ({
        done: items.length === 0,
        value: items.shift()
      })
    }
  }
}

异步迭代器

和同步不同的是,它返回了一个 Promise。

const justjavac = {
  [Symbol.asyncIterator]: () => {
    const items = [`j`, `u`, `s`, `t`, `j`, `a`, `v`, `a`, `c`];
    return {
      next: () => Promise.resolve({
        done: items.length === 0,
        value: items.shift()
      })
    }
  }
}

我们可以使用如下代码进行遍历:

(async function(){
  for await (const item of justjavac) {
    console.log(item)
  }
})();

转载请注明:OnlyLing - Web 前端开发者 » 异步迭代器 for-await-of