• 生成器的异步操作


    异步操作

      所谓"异步",简单说就是一个任务不是连续完成的,可以理解成该任务被人为分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段

    Generator

      Generator 函数是协程在 ES6 的实现,最大特点就是可以交出函数的执行权, 来源于协成, 协成是为了解决多任务并行执行而提出的, 异步编程也可以看成是这个东西 

    thunk 函数

      thunk 函数是自动执行 Generator 函数的一种方法。

      编译器的“传名调用”实现,往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体。这个临时函数就叫做 Thunk 函数

      

    var thunk = function () {
      return x + 5;
    };
    
    function f(thunk) {
      return thunk() * 2;
    }
    

      

    求值策略

      函数参数何时计算的问题

      传值调用

        参数传入之前计算

      传名调用

        参数直接传入, 使用的时候再计算

    js 的 thunk 就是把多个参数的传值调用变为传明调用

    generator 无法自动执行多个异步操作, 因为 next 和 next 之间无法判断上一个 next 是否异步已经完成了, 为了确保上一个 next 玩抽异步操作后才执行下一步, 需要引入 thunk

    在 thunk 的回调函中把执行权返回

    function run(fn) {
      var gen = fn();
    
      function next(err, data) {
    // 这个代码写的确实常人无法理解
    // next 返回的死一个 chunk 函数, data 被传入放在了 f* 中 var result = gen.next(data); if (result.done) return;
    // 这里确保了在执行完成异步操作后才会执行下一个. 但是如果有回调的逻辑怎么办??? 把 next 封装在一个函数中吗 result.value(next); } next(); }
    var g = function* (){
      var f1 = yield readFileThunk('fileA');
      var f2 = yield readFileThunk('fileB');
      // ...
      var fn = yield readFileThunk('fileN');
    };
    run(g);

      

    co 模块是一种 generato 自动执行模块

    generator 最大的作用应该是可以暂停回复一个函数的执行, 这种特性可以让多个函数做协调的执行, 达到协程的作用. 感觉对异步编程来说确实是一种新的方式

    但是感觉还是依赖于回调函数啊, 有些东西还是没分清, 除了解决了回调地狱, 相比于 promise 没有啥优势啊

  • 相关阅读:
    《信息安全专业导论》第十一周学习总结
    模拟进程
    GPG实践
    信安导论2020-2021上第十三周总结(20201222)
    NMap
    信安导论2020-2021上第十二周总结(20201222)
    python模拟进程状态
    信安导论2020-2021上第十一周总结(20201222)
    信安导论2020-2021上第十周总结(20201222)
    Openssl 20201332
  • 原文地址:https://www.cnblogs.com/cgdx/p/10794636.html
Copyright © 2020-2023  润新知