本篇文章又是一期优雅的代码编程介绍———回调函数。
传统的nodejs编程都是这样的
const fs = require('fs')
fs.readFile('test.txt','utf8', function(err, dataStr){if(err){}
})
嵌套层级如果多了就成回调地狱了。如果我们将这种风格的代码转换成这样呢?
const fs = require('fs');
const {promisfy, waitFor, promisfyNoError} = require('promisfy');
const readFile = promisfy(fs.readFile);
let content = await readFile('myfile.txt', {encoding:'utf8'});
return content;
http.createServer(80, function(req, res) {async function handleRequest(req, res) {if (req.method === 'POST') {req.body = await waitFor(req.sock, 'data');}}
})
这种promisfy
的风格是不是简洁优雅,一行就搞定了。
安装
npm install --save promisfy
promisfy
包里封装了以下三个函数
promisfy
: 处理fs
这种回调API
。waitFor
: 处理监听事件和流的,对象具有xx.on('event')
,xx.on('data')
,xx.on('end')
这些监听事件。promisfyNoError
: 处理回调没有错误抛出的API
源码
- 参数:传入需要
promisfy
的函数和上下文 - 返回值:返回一个新函数
const readFile = promisfy(fs.readFile);
let content = await readFile('myfile.txt', {encoding:'utf8'});
解析代码
1.通过agruments
内置对象取到函数readFile
的参数。
2.调用readFile
返回的是一个Promise
对象。
3.Promise
里声明了一个callback
函数。callback
传入的参数结构是第一个为err
对象,剩余参数为成功的结果。err
对象通过reject
函数处理,剩余参数用resolve
函数处理。
4.处理函数的参数fnArgs
,args
和callback
。
5.最后调用这个函数并传入上下文。
promisfyNoError
:和上述逻辑一样除去了err
对象的部分;waitFor
:对普通事件监听和流处理做的promisfy
封装;
结束语
对于回调这种风格的函数还有事件监听和数据流进行promisfy
处理后,就节省了很多很多代码行数,清晰明了。优雅的风格依然还在,还能做一个艺术工程师。
类似的,我们在微信网页开发的时候使用weixin-jssdk
,也可以自己封装一个promisfy
风格的函数。我们的代码里也不会有看着费劲的屎山了。
wx.request({xxx:'',xxx:'',xxx:'',success(){},fail(){}
})
最后
为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。
有需要的小伙伴,可以点击下方卡片领取,无偿分享