生成器的异步操作

异步操作

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值