Generator函数的异步应用

本系列属于阮一峰老师所著的ECMAScript 6 入门学习笔记


传统方法

ES6之前,异步编程的方法,大概有下面四种:

  • 回调函数
  • 事件监听
  • 发布/订阅
  • Promise对象

Generator函数将JavaScript异步编程带入了一个全新的阶段

概念

传统的编程语言,早有异步编程的解决方案,即多任务解决方案。其中一种叫"携程"(coroutine),意思是多线程相互协作,完成异步任务

// yield命令成为异步两个阶段的分界线,利用yield暂停任务,进行异步操作
function* asyncJob(){
  // ...其他代码
  var f= yield readFile(fileA)
  // ...其他代码
}
Generator函数的数据交换和错误处理

Generator函数可以暂停执行和恢复执行,这是它能封装异步任务的根本原因。除此之外,它还有两个特性可以作为异步编程的完美解决方案:函数体内外数据交换和错误处理机制

// next返回值的value属性,是Generator函数向外输出的数据;next还可以接收参数,向Generator函数体内输入数据
function* gen(x){
  var y = yield x + 2
  return y
}
var g = gen(1)
g.next() // {value:3,done:false}
g.next(2) // {value:2,done:false}

// Generator函数内部可以部署错误处理代码,捕获函数体外抛出的错误
function* gen(x){
  try{
    var y = yield x + 2
  }catch(e){
    console.log(e)
  }
  return y
}
var g = gen(1)
g.next()
g.throw('出错了') // 出错了
Thunk函数

Thunk函数是自动执行Generator函数的一种方法。编译器“传名调用”实现,往往是将参数放在一个临时函数中,再将这个临时函数传入函数体,这个临时函数就是Thunk函数

function f(m){
  return m * 2
}
f(x+5)
// 等同于
var thunk = function(){
  return x + 5
}
function f(thunk){
  return thunk() * 2
}
JavaScript语言的Thunk函数

JavaScript语言是传值调用,它的Thunk函数含义有所不同。在JavaScript语言中,Thunk函数替换的不是表达式,而是多参数函数,将其替换成一个接受回调函数作为参数的单参数函数

// 正常多参数数版本函数
fs.readFile(fileName,callback)

// Thunk版本单参数函数
var Thunk = function(fileName){
  return function(callback){
    return fs.readFile(fileName,callback)
  }
}
var readFileThunk = Thunk(fileName)
readFileThunk(callback)

// 任何函数,只要参数又回调函数,就能写成Thunk函数的形式
const Thunk = function(fn){
  return function(...args){
    return function(callback){
      return fn.call(this,...args,callback)
    }
  }
}
// 利用以上转换器,生成f的Thunk函数
function f(a,cb){
  cb(a)
}
const ft = Thunk(f)
ft(1)(console.log) // 1
Generator函数的流程管理

Thunk函数现在可以用于Generator函数的自动流程管理。但Thunk函数并不是Generator函数自动执行的唯一方案。因为自动执行的关键是,必须有一种机制,自动控制Generator函数的流程,接收和交还程序的执行权。回调函数可以做到,Promise对象也可以做到

function run(fn){
  var gen = fn()
  function next(err,data){
    var result = gen.next(data)
    if(result.done) return
    result.value(next)
  }
  next()
}

function* g(){
  // ...
}
// run函数是一个Generator函数的自动执行器,next函数是Thunk的回调函数,result.value就是Thunk函数
run(g)

转载于:https://www.cnblogs.com/pengzhixin/p/7699543.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值