if(err) {
reject(err)
} else {
resolve(res)
}
})
})
}
Node.js提供的Promisify方法
const {promisify} = require(‘util’) // 对象结构,promisify是util模块的一个方法,它接收一个错误优先的异步函数,返回一个Prmise对象
readFilePromisify = promisify(fs.readFile)
async function fn(){
await readFilePromisify(‘./1.txt’,‘utf8’)
}
这简直是“如听仙乐耳暂明”般的体验。
被Node.js的util模块的promisify处理过的fs.readFile异步函数,不需要再封装进Promise对象中,不需要再定义回调函数。
因为这都被util.promisify给内部封装了。
实现简单的Promisify,帮助理解其工作原理
promisify方法结构是:
接收一个错误优先的异步函数A
返回一个和A具有相同形参(不包括回调函数形参)的函数B
关于错误优先的异步函数解释
常见的异步任务都需要一个回调函数参数,而这个回调函数用于处理异步操作完成后的结果。
所以回调函数需要接收异步操作的结果,我们知道异步操作可能成功,可能失败。所以
回调函数的接收参数分为两个成功参数,失败参数。
而Node.js提倡错误优先的回调函数形参定义规则。
即err形参作为回调函数的第一个形参,后面的参数就是成功的形参。
这样做的好处就是规范了异步任务的回调函数形参定义。方便后续统一对回调函数进行处理。
promisify的工作原理
promisify方法入参是错误优先的异步函数A,返回是“不需要回调函数形参的,其余形参相同“的函数B。
例如:
fs.readFile(文件路径,编码,回调函数) 就是A
readFilePromisify(文件路径,编码) 就是B
那么B的作用是什么呢?
B的作用是将A封装进Promise对象,即将原本我们每次都要对异步函数的封装Promise动作,内置到B中,只需要调用B,就完成了对异步函数的Promise封装。
B为什么不需要传入回调函数参数?
1、B可以猜测到A的回调函数的架构,即错误优先
2、A的回调函数主要用于设置Promise对象的状态和结果,属于封装Promise的重要步骤,需要内敛到B中,而无法在B的外面设置。
function promisify(fn){// promisify接收一个错误优先的异步函数fn
return function(…args){ // promisify返回一个函数,该函数接收和fn的一样的除了回调函数参数外的参数
return new Promise((resolve,reject)=>{ // 返回一个Promise对象,该对象的状态和结果自动设置
fn.call(this,…args,(err,res)=>{ // 等价于 this.fn(…args,(err,res)=>{})
if(err) {
reject(err)
} else {
resolve(res)
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!