生成器的异步操作

异步操作

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

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

原文地址:https://www.cnblogs.com/cgdx/p/10794636.html