zoukankan      html  css  js  c++  java
  • 生成器的异步操作

    异步操作

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

    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 没有啥优势啊

  • 相关阅读:
    jquery实现选项卡(两句即可实现)
    常用特效积累
    jquery学习笔记
    idong常用js总结
    织梦添加幻灯片的方法
    LeetCode "Copy List with Random Pointer"
    LeetCode "Remove Nth Node From End of List"
    LeetCode "Sqrt(x)"
    LeetCode "Construct Binary Tree from Inorder and Postorder Traversal"
    LeetCode "Construct Binary Tree from Preorder and Inorder Traversal"
  • 原文地址:https://www.cnblogs.com/cgdx/p/10794636.html
Copyright © 2011-2022 走看看