我们再Node中经常有读取文件操作,如
const fs = require('fs')
const path = require('path');
fs.readFile(path.join(__dirname, '/promise.js'), 'utf8', (err, data) => {
console.log('err', err)
console.log('data', data)
})
但是读取文件的操作永远是error放在前面,若能读取成功,读取成功的文件数据放在后面,那么我们能不能实现,读取文件也用类似于Promise的方式实现链式调用呢?这时候就要用到promisefy了
promisify 采用遵循常见的错误优先的回调风格的函数(也就是将 (err, value) => ... 回调作为最后一个参数),并返回一个返回 promise 的版本。
当然nodejs中的工具类中已经有这个方法了,下面我们手写实现一个promisify函数
function promisefy (readFile) {
return function (...args) {
return new Promise((resolve, reject) => {
readFile(...args, (err, data) => {
if (err) reject(err)
resolve(data)
})
})
}
}
我们还可以实现promisefyAll函数,把fs中的所有方法都转化成类型promise链式调用
function promiseAll (obj) {
let o = {}
for (const key in obj) {
if (typeof obj[key] === 'function') {
o[`${key}Promise`] = promisefy(obj[key])
}
}
return o
}
let newFs = promiseAll(fs)
newFs.readFilePromise(path.join(__dirname, '/promise.js'), 'utf8')
.then(data => {
console.log('data', data)
}).catch(err => {
console.log('err', err)
})