ES6 生成器

发布于 2024-03-29 22:46:11 字数 2063 浏览 19 评论 0

ES6 的很多特性都跟 Generator 扯上关系,而且实际用处比较广, 包含了任何需要异步的模块, 比如 ajaxfilesystem, 或者数组对象遍历等都可以用到。

一. 基本使用

Generator 函数和普通的函数区别有两个:

  1. function 和函数名之间有一个 * 号,
  2. 函数体内部使用了 yield 表达式。比如这样:
function * gen() {
    yield "1";
    yield "2"
}

这个玩意儿如果运行的话,会返回一个 Iterator 实例, 然后再执行 Iterator 实例的next()方法, 那么这个函数才开始真正运行, 并把 yield 后面的值包装成固定对象并返回,直到运行到函数结尾, 最后再返回undefined

function* fibonacci() {
    yield 1;
    yield 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.next());   // 2
console.log(it.next()); //undefined

1.1 yield

Generator 函数返回的 Iterator 运行的过程中,如果碰到了 yield, 就会把 yield 后面的值返回, 此时函数相当于停止了, 下次再执行 next() 方法的时候, 函数又会从上次退出去的地方重新开始执行;

如果把yieldreturn一起使用的话, 那么 return 的值也会作为最后的返回值, 如果 return 语句后面还有 yield, 那么这些 yield 不生效:

function* gen() {
    yield 0;
    yield 1;
    return 2;
    yield 3;
};
let g = gen();
console.log(g.next(),g.next(),g.next(),g.next());
//输出:{ value: 0, done: false } { value: 1, done: false } { value: 2, done: true } { value: undefined, done: true }

二. next 方法传参

如果给 next 方法传参数, 那么这个参数将会作为上一次yield 语句的返回值 ,这个特性在异步处理中是非常重要的, 因为在执行异步代码以后, 有时候需要上一个异步的结果, 作为下次异步的参数, 如此循环:

function* foo(x) {
    var y = 2 * (yield (x + 1));
    var z = yield (y / 3);
    return (x + y + z);
}

var a = foo(5);
a.next() // Object{value:6, done:false}
a.next() // Object{value:NaN, done:false}
a.next() // Object{value:NaN, done:true}

var b = foo(5);
b.next() // { value:6, done:false }
b.next(12) // { value:8, done:false }
b.next(13) // { value:42, done:true }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

御守

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文