请教一下老师

来源: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回答

谢成

2020-08-31

1、建议先把我之前发的文档再认真看下,MDN文档: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for-await...of

//img1.sycdn.imooc.com/szimg/5f4c9b22096fb76a14521058.jpg

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]


0
1
hy_wang
哦哦明白了,谢谢老师
2020-08-31
共1条回复

JavaScript ES(6-11)全版本语法 前端都需要的基础课

前端无门槛学习,从ES6到ES11,一套课程掌握JS最新语法

1328 学习 · 296 问题

查看课程