20200314

@xiaojingzhao

Plan

  • 你不知道的 js

Notes

生成器产生值

生产者与迭代器

  • for of 可以循环可迭代的对象,但是无法向迭代器中的 next 传值
  • iterable protocol: 可以在一个对象上自定义迭代器。请参考 demo
  • 生成器返回迭代器
function* something() {
  var nextVal;
  while (true) {
    if (nextVal === undefined) {
      nextVal = 1;
    } else {
      nextVal = 3 * nextVal + 6;
    }
    yield nextVal;
  }
}

停止生成器

  • 一个生成器会构造一个迭代器,迭代器可以被 for of 循环
  • 在 for...of 中使用 break 或者 return 会触发迭代器中的 finally
function* something() {
  try {
    var nextVal;
    while (true) {
      if (nextVal === undefined) {
        nextVal = 1;
      } else {
        nextVal = 3 * nextVal + 6;
      }
      yield nextVal;
    }
  } catch (e) {
    console.log("error", error);
  } finally {
    console.log("finally here");
  }
}
var it = something();
for (let v of it) {
  console.log("value", v);
  if (v > 500) {
    // break; // it 结束, 触发finally
    // console.log(it.return("hello world").value); // it 结束, 触发finally
  }
}

异步生成器

  • 在异步的生成器中,yield 可以捕获异步的错误
  • 可以通过 iterator.throw 向生成器内部抛入错误

More