同步迭代 Symbol.iterator
const arr = ['es6', 'es7', 'es8', 'es9']
arr[Symbol.iterator] = function(){
let nextIndex = 0
return {
next(){
return nextIndex < arr.length ? {
value: arr[nextIndex++],
done: false
} : {
value: undefined,
done: true
}
}
}
}
for(let item of arr) {
console.log(item)
}
我希望当前迭代执行完之后再去执行下一个,使用到属性Symbol.asyncIterator
function getPromise(time) {
return new Promise((resolve, reject) => {
setTimeout(()=>{
resolve({
value: time,
done: false
})
}, time)
})
}
const arr = [getPromise(1000), getPromise(2000),getPromise(3000),]
arr[Symbol.asyncIterator] = function(){
let nextIndex = 0
return {
next(){
return nextIndex < arr.length ? arr[nextIndex++]:Promise.resolve({
value: undefined,
done: true
})
}
}
}
//for await of 等待promise 对象变成resolve 之后,再去执行下一个
一个异步执行操作完成之后再去取下一个异步操作
async function test(){
for await (let item of arr) {
console.log(item)
}
}
test()