请教一下老师
来源:7-1 异步迭代:for await of
hy_wang
2020-08-31
请问下老师为什么这段代码会一直死循环
function timeout(time) {
return new Promise((res, rej) => {
setTimeout(() => {
res(time);
}, time);
});
}
const arr = [1, 2, timeout(1000), 3, timeout(2000), 4, 5, 6];
arr[Symbol.asyncIterator] = function* () {
while (true) {
yield "async";
}
};
arr[Symbol.iterator] = (function* () {
yield "synchronization";
yield "synchronization";
yield "synchronization";
yield "synchronization";
yield "synchronization";
})(
(async function () {
for await (let i of arr) {
console.log(i);
}
})()
);
},
输出结果无限循环打印async。
以及请问老师这种场景,arr中既有同步也有异步,我使用for await of 进行循环他只会调用asyncIterator吗?即便arr中存在非异步(比如数组中的Number)类型,也不会调用symbol.iterator吗?
1回答
-
1、建议先把我之前发的文档再认真看下,MDN文档: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for-await...of
2、你的需求应该是这个意思吧:
function timeout(time) {
return new Promise((res, rej) => {
setTimeout(() => {
res(time);
}, time);
});
}
const arr = [1, 2, timeout(1000), 3, timeout(2000), 4, 5, 6];
async function* asyncGenerator() {
let nextIndex = 0
while (nextIndex < arr.length) {
yield arr[nextIndex++]
}
}
(async function () {
for await (let item of asyncGenerator()) {
console.log(item);
}
})()
3、for of通过调用[Symbol.iterator]取得迭代器。for await of通过调用arr[Symbol.asyncIterator]获得迭代器,如果没有话会退而求其次取arr[Symbol.iterator]
012020-08-31
相似问题