ES6 Generators

2017-01-23  本文已影响17人  yangweigbh

生成器函数


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!";
}

生成器的使用

> 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);
}

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;
}
上一篇 下一篇

猜你喜欢

热点阅读