查看原文 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
键的属性:
String
,Array
,TypedArray
,Map
和 Set
都内置可迭代对象,因为它们的原型对象都有一个 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)
}
})();