侧边栏壁纸
博主头像
woku博主等级

成功的路上并不拥挤

  • 累计撰写 50 篇文章
  • 累计创建 13 个标签
  • 累计收到 3 条评论

promisify和promisifyAll

woku
2022-06-15 / 0 评论 / 0 点赞 / 139 阅读 / 1,568 字

在Node中有fs.readFile实现文件读取,是通过回调的形式来获取结果和错误。

const fs = require('fs')
fs.readFile('./data/user.js', 'utf-8', function (err, data) {
    if (err) {
       return console.log('error', err)
    }
    console.log(data)
})

那么我们能不能实现,读取文件也用类似于Promise的方式实现链式调用呢?
我们需要将fs.readFile这个函数promise化。

promisify

  • bluebird库来对回调函数转换成promise异步解决方案

bluebird.promisify对指定的方法进行promise化

const fs = require('fs')
const bluebird = require('bluebird')
const readFile = bluebird.promisify(fs.readFile)
readFile('./data/user.js', 'utf-8').then(data => {
    console.log(data)
}, err => {
    console.log(err)
})
  • 使用Node中提供的util工具库
const fs = require('fs')
const util = require('util')
const readFile = util.promisify(fs.readFile)
readFile('./data/user.js', 'utf-8').then(data => {
    console.log(data)
}, err => {
    console.log(err)
})

promisifyAll

  • require('fs').promises

将fs中的所有方法全部promise化

const fs = require('fs').promises
fs.readFile('./data/user.js', 'utf-8').then(data => {
    console.log('success', data)
}, err => {
    console.log(err)
})
  • bluebird库来对回调函数转换成promise异步解决方案

bluebird.promisifyAll对所有的方法进行promise化
会给fs中的所有方法新增一个promise化的版本

const fs = require('fs')
const bluebird = require('bluebird')
bluebird.promisifyAll(fs)
fs.readFileAsync('./data/user.js', 'utf-8').then(data => {
    console.log(data)
}, err => {
    console.log(err)
})

实现promisify和promisifyAll

const MyPromise = require('../myPromise.js')
module.exports = {
    promisify(fn) {
        // 返回一个新的函数
        return function() {
            return new MyPromise((resolve, reject) => {
                fn(...arguments, (err, data) => {
                    if (err) {
                        return reject(err)
                    }
                    resolve(data)
                })
            })
        }
    },
    promisifyAll(fns) {
        Object.keys(fns).map(fnName => {
            if (typeof fns[fnName] === 'function') {
                fns[fnName + 'Async'] = this.promisify(fns[fnName])
            }
        })
        return fns
    }
}
0

评论区