手动实现一个promisefy函数

830 阅读1分钟

我们再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)
})