- 函子可以控制副作用,还可以处理异步任务,为了避免地狱之门。
- 异步任务的实现过于复杂,我们使用 folktale 中的 Task 来演示
- folktale 一个标准的函数式编程库。和 lodash、ramda 不同的是,他没有提供很多功能函数。只提供了一些函数式处理的操作,例如:compose、curry 等,一些函子 Task、Either、 MayBe 等
- 安装folktale的库: npm i folktale
- folktale中的curry函数 ```javascript const { compose, curry } = require(‘folktale/core/lambda’)
// curry中的第一个参数是函数有几个参数,为了避免一些错误 const f = curry(2, (x, y) => x + y)
console.log(f(1, 2)) // 3 console.log(f(1)(2)) // 3
3. folktale中的curry函数
```javascript
const { compose, curry } = require('folktale/core/lambda')
const { toUpper, first } = require('lodash/fp')
// compose 组合函数在lodash里面是flowRight
const r = compose(toUpper, first)
console.log(r(['one', 'two'])) // ONE
- Task函子异步执行: ```javascript const { task } = require(‘folktale/concurrency/task’) const fs = require(‘fs’) const { split, find } = require(‘lodash/fp’) // 2.0中是一个函数,函数返回一个函子对象 // 1.0中是一个类
//读取文件 function readFile (filename) { // task传递一个函数,参数是resolver // resolver里面有两个参数,一个是reject失败的时候执行的,一个是resolve成功的时候执行的 return task(resolver => { //node中读取文件,第一个参数是路径,第二个是编码,第三个是回调,错误在先 fs.readFile(filename, ‘utf-8’, (err, data) => { if(err) resolver.reject(err) resolver.resolve(data) }) }) }
//演示一下调用 // readFile调用返回的是Task函子,调用要用run方法 readFile(‘package.json’) //在run之前调用map方法,在map方法中会处理的拿到文件返回结果 // 在使用函子的时候就没有必要想的实现机制 .map(split(‘\n’)) .map(find(x => x.includes(‘version’))) .run() // 现在没有对resolve进行处理,可以使用task的listen去监听获取的结果 // listen传一个对象,onRejected是监听错误结果,onResolved是监听正确结果 .listen({ onRejected: (err) => { console.log(err) }, onResolved: (value) => { console.log(value) // “version”: “1.0.0”, } }) ```