zoukankan      html  css  js  c++  java
  • js-ES6学习笔记-Generator函数的应用

    1、异步操作的同步化表达

    Generator函数的暂停执行的效果,意味着可以把异步操作写在yield语句里面,等到调用next方法时再往后执行。这实际上等同于不需要写回调函数了,因为异步操作的后续操作可以放在yield语句下面,反正要等到调用next方法时再执行。所以,Generator函数的一个重要实际意义就是用来处理异步操作,改写回调函数。

    function* loadUI() {
      showLoadingScreen();
      yield loadUIDataAsynchronously();
      hideLoadingScreen();
    }
    var loader = loadUI();
    // 加载UI
    loader.next()
    
    // 卸载UI
    loader.next()

    2、控制流管理

    如果有一个多步操作非常耗时,采用回调函数,可能会写成下面这样。

    step1(function (value1) {
      step2(value1, function(value2) {
        step3(value2, function(value3) {
          step4(value3, function(value4) {
            // Do something with value4
          });
        });
      });
    });

    采用Promise改写上面的代码。

    Promise.resolve(step1)
      .then(step2)
      .then(step3)
      .then(step4)
      .then(function (value4) {
        // Do something with value4
      }, function (error) {
        // Handle any error from step1 through step4
      })
      .done();

    上面代码已经把回调函数,改成了直线执行的形式,但是加入了大量Promise的语法。Generator函数可以进一步改善代码运行流程。

    function* longRunningTask(value1) {
      try {
        var value2 = yield step1(value1);
        var value3 = yield step2(value2);
        var value4 = yield step3(value3);
        var value5 = yield step4(value4);
        // Do something with value4
      } catch (e) {
        // Handle any error from step1 through step4
      }
    }

    3、部署Iterator接口

    利用Generator函数,可以在任意对象上部署Iterator接口。

    function* iterEntries(obj) {
      let keys = Object.keys(obj);
      for (let i=0; i < keys.length; i++) {
        let key = keys[i];
        yield [key, obj[key]];
      }
    }
    
    let myObj = { foo: 3, bar: 7 };
    
    for (let [key, value] of iterEntries(myObj)) {
      console.log(key, value);
    }
    
    // foo 3
    // bar 7

    4、作为数据结构

    Generator可以看作是数据结构,更确切地说,可以看作是一个数组结构,因为Generator函数可以返回一系列的值,这意味着它可以对任意表达式,提供类似数组的接口。

    来自http://es6.ruanyifeng.com/#docs/generator#应用

  • 相关阅读:
    php弱类型比较
    sql手注例子
    XFF等使用burp伪造请求
    XXE任意文件读取(当xml解析内容有输出时)
    本地文件包含LFI
    Java的访问修饰符的作用范围
    如何用“与”,“或”,“非” 实现 “异或”运算?
    windows下安装rabbitMQ教程(实战可用)
    注解@RequestParam与@RequestBody,@PathVariable的使用介绍
    maven install命令的用处(项目A依赖项目B,项目B发生修改,此时如果项目A打包引用修改后的B项目场景)
  • 原文地址:https://www.cnblogs.com/zczhangcui/p/6516981.html
Copyright © 2011-2022 走看看