ES6 Generators

生成器函数


function* quips(name) {
  yield "hello " + name + "!";
  yield "i hope you are enjoying the blog posts";
  if (name.startsWith("X")) {
    yield "it's cool how your name starts with X, " + name;
  }
  yield "see you later!";
}
  • 生成器函数以function*标注
  • yield关键字,会暂停生成器的执行,在之后可以继续执行

生成器的使用

> var iter = quips("jorendorff");
  [object Generator]
> iter.next()
  { value: "hello jorendorff!", done: false }
> iter.next()
  { value: "i hope you are enjoying the blog posts", done: false }
> iter.next()
  { value: "see you later!", done: false }
> iter.next()
  { value: undefined, done: true }

当执行生成器函数时,函数不会立即执行,调用next方法会执行到下一个yield语句,并返回yield的值

当所有yield执行完成后,返回 { value: undefined, done: true }

生成器函数是迭代器

function* range(start, stop) {
  for (var i = start; i < stop; i++)
    yield i;
}

for (var value of range(0, 3)) {
  alert("Ding! at floor #" + value);
}
  • 生成器对象的next函数可以传值,传入的值作为yield的返回值
  • return方法结束生成器方法的执行,但如果生成器方法里有finally,则会执行finally
  • throw方法会在yield方法出抛出异常
  • 如果生成器对象的return方法没被调用,却被回收了,则finally不会被执行

yield*可以返回iterator的所有值

function* concat(iter1, iter2) {
  for (var value of iter1) {
    yield value;
  }
  for (var value of iter2) {
    yield value;
  }
}

以上可以简写为:

function* concat(iter1, iter2) {
  yield* iter1;
  yield* iter2;
}

你可能感兴趣的:(ES6 Generators)