生成器(Generators)简介

生成器函数

  • 普通函数使用 function 声明,而生成器函数使用 function* 声明
  • 在生成器函数内部,有一种类似 return 的语法:关键字 yield。二者的区别是,普通函数只可以 return 一次,而生成器函数可以 yield 多次(当然也可以只 yield 一次)。在生成器的执行过程中,遇到 yield 表达式立即暂停,后续可恢复执行状态。

普通函数和生成器函数之间最大的区别,普通函数不能自暂停,生成器函数可以。

function* quips(name) {
  yield " 你好 " + name + "!";
  yield " 希望你能喜欢这篇介绍 ES6 的译文 ";
  if (name.startsWith("X")) {
    yield " 你的名字 " + name + "  首字母是 X,这很酷!";
  }
  yield " 我们下次再见!";
}

调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的 迭代器 ( iterator )对象。

> var iter = quips("jorendorff");
  [object Generator]
> iter.next()
  { value: " 你好 jorendorff!", done: false }
> iter.next()
  { value: " 希望你能喜欢这篇介绍 ES6 的译文 ", done: false }
> iter.next()
  { value: " 我们下次再见!", done: false }
> iter.next()
  { value: undefined, done: true }

next()

next() 方法返回一个包含属性 done 和 value 的对象。
该方法也可以通过接受一个参数用以向生成器传值。

function* gen() {
  while(true) {
    var value = yield null;
    console.log(value);
  }
}

var g = gen();
g.next(1);
// "{ value: null, done: false }"
g.next(2);
// 2
// "{ value: null, done: false }"

yield*

返回一个Generator

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

throw()

throw() 方法用来向生成器抛出异常,并恢复生成器的执行,返回带有 done 及 value 两个属性的对象。

var g = function* () {
    try {
        yield 1;
        console.log('输出',1);
        yield 2;
        console.log('输出',2);
        yield 3;
    } catch (e) {
        console.log('内部捕获', e);
    }
};

var i = g();

try {
    i.next(); // { value: 1, done: false }
    i.next(); // { value: 2, done: false }
    i.throw('a');
    i.next(); // { value: undefined, done: true }
    i.throw('b');
    i.throw('c');
} catch (e) {
    console.log('外部捕获', e);
}

return()

return() 方法返回给定的值并结束生成器。

unction* gen() {
  yield 1;
  yield 2;
  yield 3;
}

var g = gen();

g.next();        // { value: 1, done: false }
g.return("foo"); // { value: "foo", done: true }
g.next();        // { value: undefined, done: true }
posted @   远方的少年🐬  阅读(292)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示