Thunk 函数


Thunk 函数

要想让Generator和异步操作产生联系,就必须过thunk函数这一关。这一关过了之后,立即就可以着手异步操作的事情,因此大家再坚持坚持。至于thunk函数是什么,下文会详细演示。

本节内容概述

  • 一个普通的异步函数
  • 封装成一个thunk函数
  • thunk函数的特点
  • 使用thunkify
  • 接下来...

一个普通的异步函数

就用 nodejs 中读取文件的函数为例,通常都这么写

fs.readFile('data1.json', 'utf-8', (err, data) => {
    // 获取文件内容
})

其实这个写法就是将三个参数都传递给fs.readFile这个方法,其中最后一个参数是一个callback函数。这种函数叫做 多参数函数,我们接下来做一个改造

封装成一个thunk函数

改造的代码如下所示。不过是不是感觉越改造越复杂了?不过请相信:你看到的复杂仅仅是表面的,这一点东西变的复杂,是为了让以后更加复杂的东西变得简单。对于个体而言,随性比较简单,遵守规则比较复杂;但是对于整体(包含很多个体)而言,大家都随性就不好控制了,而大家都遵守规则就很容易管理 ———— 就是这个道理!

const thunk = function (fileName, codeType) {
    // 返回一个只接受 callback 参数的函数
    return function (callback) {
        fs.readFile(fileName, codeType, callback)
    }
}
const readFileThunk = thunk('data1.json', 'utf-8')
readFileThunk((err, data) => {
    // 获取文件内容
})

先自己看一看以上代码,应该是能看懂的,但是你可能就是看懂了却不知道这么做的意义在哪里。意义先不管,先把它看懂,意义下一节就会看到。

  • 执行const readFileThunk = thunk('data1.json', 'utf-8')返回的其实是一个函数
  • readFileThunk这个函数,只接受一个参数,而且这个参数是一个callback函数

thunk函数的特点

就上上面的代码,我们经过对传统的异步操作函数进行封装,得到一个只有一个参数的函数,而且这个参数是一个callback函数,那这就是一个thunk函数。就像上面代码中readFileThunk一样。

使用thunkify

上面代码的封装,是我们手动来做的,但是没遇到一个情况就需要手动做吗?在这个开源的时代当让不会这样,直接使用第三方的thunkify就好了。

首先要安装npm i thunkify --save,然后在代码的最上方引用const thunkify = require('thunkify')。最后,上面我们手动写的代码,完全可以简化成这几行,非常简单!

const thunk = thunkify(fs.readFile)
const readFileThunk = thunk('data1.json', 'utf-8')
readFileThunk((err, data) => {
    // 获取文件内容
})

接下来...

了解了thunk函数,我们立刻就将Generator和异步操作进行结合