17.4 thunk函数

1:函数的参数到底应该在何时求值

function f(m){
    return m*2
}
var x=1
f(x+5)

(1)传值调用:在进入函数之前先计算x+5的值,然后再将这个值传入函数内部;C语言就采用了这种策略
(2)传名调用:直接将表达式(x+5)传入函数内部。用到的时候在求值;

2:传名调用的实现往往是将参数放到一个临时函数之中,再将这个临时函数传入函数体;这个临时函数就是thunk函数;用来替换某个表达式


function f(m){
    return m*2
}
f(x+5)
//等同于
var thunk=function(){
    return x+5
}
function f(thunk){
}return thunk()*2

JS中的thunk有所不同,替换的不是表达式,而是多参数函数;将其替换成一个只接受回调函数作为参数的单参数函数;任何函数,只要参数有回调函数,就能写成thunk的形式
2:generator函数的流程管理,下面的代码generator函数会自动完成所有步骤,但是这个不适合异步操作;

function *gen() {
    yield 1
    yield 2
    yield 3
    yield 4
}
var g=gen()
var res=gen().next()
while (!res.done){
    console.log(res)
    res=g.next()
}
// 执行结果
// { value: 1, done: false }
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: 4, done: false }

3:thunk函数的手动执行

var fs=require('fs')
var thunkify=require('thunkify')
var readFileThunk=thunkify(fs.readFile)
function *gen() {
    var r1=yield readFileThunk('etc/fatab')
    console.log(r1.toString())
    var r2=yield readFileThunk('etc/shells')
    console.log(r2.toString())
}
var g=gen()
var r1=g.next()
r1.value(function (err,data) {
    if(err){
        throw err
    }
    var r2=g.next(data)
    r2.value(function (err,data) {
        if(err) throw err
        g.next(data)
    })
})

4:thunk函数真真的威力在于可以自动执行generator函数;

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

run函数就是一个generator函数的自动执行器,内部的next就是thunk的回调函数;
有了这个执行器以后,不管内部有多少个异步操作;前提是每个异步操作都要是一个thunk函数,也就是说跟在yield命令后面的必须是thunk函数;
5:thunk函数并不是generator函数自动执行的唯一方案,因为自动执行的关键是必须有一种机制自动控制generator函数的流程,接受和交换程序的执行权;回调函数可以做到这一点,promise也可以做到这点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值