前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >promisify与unpromisify

promisify与unpromisify

作者头像
kai666666
发布2021-01-21 23:15:56
8330
发布2021-01-21 23:15:56
举报
文章被收录于专栏:橙光笔记橙光笔记

Promise是JavaScript中一种常用的异步处理的方式,它可以有效地避免回调地狱。那么promisify是什么意思呢?在英语中ify结尾的单词一般为动词,表示“使……化”,那么很显然promisify就是“使Promise化”,通俗一点就是把回调函数转化为Promise这种形式。

promisify

promisify的代码相对来说比较简单,这里直接给出代码:

代码语言:javascript
复制
function promisify(fn) {
  return (...rest) => {
    return new Promise((resolve, reject) => {
      fn(...rest, (err, result) => {
        if(err){
          reject(err)
          return
        }
        resolve(result)
      })
    })
  }
}

假设我们在node中的fs.readFile方法上使用它,那么有:

代码语言:javascript
复制
const fs = require('fs')

const redFilePromise = promisify(fs.readFile)
redFilePromise('./data.json','utf-8').then(data => {
  console.log(data)
})

unpromisify

由于Promise比回调方式更优雅,所以很少有人会把Promise再转回回调方法,在讲unpromisify之前我们先写一个Promise版本的delay函数:

代码语言:javascript
复制
function delay(timeout) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve()
    }, timeout)
  })
}

delay(1000).then(() => {
  console.log('这里一秒后调用!')
})

现在定义一个unpromisify函数,将delay函数改成回调函数的版本:

代码语言:javascript
复制
function unpromisify (p, done) {
  p.then(
    data => done(null, data),
    err => done(err)
  )
}

unpromisify(delay(1000), () => {
  console.log('回调函数中一秒后调用!')
})

现成的promisify

node的util模块提供了promisify函数,可以直接拿来使用。由于很少需要unpromisify,所以该模块中并没有提供unpromisify

代码语言:javascript
复制
const fs = require('fs')
const util = require('util')

// node util模块中的promisify方法
const redFilePromise = util.promisify(fs.readFile)
redFilePromise('./data.json','utf-8').then(data => {
  console.log(data)
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • promisify
  • unpromisify
  • 现成的promisify
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档