• 技术文章 >web前端 >js教程

    ES6 Generator 基本使用

    GuanhuiGuanhui2020-06-24 18:05:58转载950

    本文实例讲述了ES6 Generator基本使用方法。分享给大家供大家参考,具体如下:

    1.Generator介绍

    先来一段Generator的基础代码

    function* g(){
     yield 100;
     yield 200;
     return 300;
    }
    let gg = g();
    console.log(gg);            // Object [Generator] {}
    console.log(gg.next());        // { value: 100, done: false }
    console.log(gg.next());        // { value: 200, done: false }
    console.log(gg.next());        // { value: 300, done: true }
    console.log(gg.next());        // { value: undefined, done: true }

    首先我们看到:

    2.Generator异步编程

    generator是ES6中引入的异步解决方案,我们来看看它与promise处理异步的对比,来看它们的差异。

    // 这里模拟了一个异步操作
    function asyncFunc(data) {
     return new Promise( resolve => {
      setTimeout(
       function() {
        resolve(data)
       },1000
      )
     })
    }

    promise的处理方式:

    asyncFunc("abc").then( res => {
     console.log(res);                    // "abc"
     return asyncFunc("def")
    }).then( res => {
     console.log(res);                    // "def"
     return asyncFunc("ghi")
    }).then( res => {
     console.log(res);                    // "ghi"
    })

    generator的处理方式:

    function* g() {
     const r1 = yield asyncFunc("abc");
     console.log(r1);                            // "abc"
     const r2 = yield asyncFunc("def");
     console.log(r2);                            // "def"
     const r3 = yield asyncFunc("ghi");
     console.log(r3);                            // "ghi"
    }
    
    let gg = g();
    let r1 = gg.next();
    r1.value.then(res => {
     let r2 = gg.next(res);
     r2.value.then(res => {
      let r3 = gg.next(res);
      r3.value.then(res => {
       gg.next(res)
      })
     })
    })

    promise多次回调显得比较复杂,代码也不够简洁,generator在异步处理上看似同步的代码,实际是异步的操作,唯一就是在处理上会相对复杂,如果只进行一次异步操作,generator更合适。

    3.yield和yield*

    先来看两段代码

    function* g1() {
     yield 100;
     yield g2();
     return 400;
    }
    
    function* g2() {
     yield 200;
     yield 300;
    }
    
    let gg = g1();
    console.log(gg.next());                // { value: 100, done: false }
    console.log(gg.next());                // { value: Object [Generator] {}, done: false }
    console.log(gg.next());                // { value: 400, done: true }
    console.log(gg.next());                // { value: undefined, done: true }
    function* g1() {
     yield 100;
     yield* g2();
     return 400;
    }
    
    function* g2() {
     yield 200;
     yield 300;
    }
    
    let gg = g1();
    console.log(gg.next());                // { value: 100, done: false }
    console.log(gg.next());                // { value: 200, done: false }
    console.log(gg.next());                // { value: 300, done: false }
    console.log(gg.next());                // { value: 400, done: true }

    yield对另一个generator不会进行遍历,返回的是迭代器对象,而yield*会对generator进行遍历迭代。

    推荐教程:《JS教程

    以上就是ES6 Generator 基本使用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:jb51,如有侵犯,请联系admin@php.cn删除
    专题推荐:ES6 Generator
    上一篇:Javascript 中 setInterval 函数怎么用? 下一篇:96个前端JS部分基础面试题(含答案)

    相关文章推荐

    • 两分钟了解jQuery与JavaScript、JS 三者间的区别• JavaScript的重构技巧• JavaScript开发中常用的方法集• JavaScript开发中 15 种常见的数组操作• 直击JavaScript ES6里最重要的5个特性

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网