Node学习知识点记录Day1 -- promisify

29 阅读2分钟

Node学习知识点记录Day1

一、目前正在学习node,记录一下第一个知识点 promisify

1、promisify是什么?

node的promisify方法,截取一下看看啊!

268df76c78dcf1ae47e21df32.png 分析一下啊

它的意思就是:promisify可以将参数中的最后一个回调函数的参数,作为一个返回方法来返回,从而可以使用promise类似的.then来做回调处理

下面新建一个方法,最后一个函数是回调函数,下面是例子:

function fun(arg, callback) {
    try {
        // aaa()
        callback(null, 'result')
    } catch (error) {
        callback(error)
    }
    console.log('fs ' + arg)
}

常规调用的方法如下:

// 回调方式
 fun('test', (err, data) => {
     console.log(err ? 'read err' : data)
 })

但是如果是用promisify处理一下之后,就可以使用类似promise的方法来调用回调函数了

// promise方式
// 先将promisify加入进来
const { promisify } = require('util')
const promise = promisify(fun)
promise('./index2.js')
    .then(data => { // 正确走这里
        console.log(data)
        }, err => { //如果有错误则走这里
            console.log('err::', err)
       }
    )

这样用起来是不是能简单一些,其实promisify的作用还是很简单的,现在咱们来看看能否自己来手写一下这个promisify的方法呢。

module.exports = function newpromisfy(fn) {
  return function(...args) {
  }
}

解释一下啊,promisify首先是一个function,所以首先创建一个function进行返回,因为是类似promise.then的方式,所以下面需要返回一个promise,看下面:

module.exports = function newpromisfy(fn) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      let callback = function(err, ...args) {
      }
      fn.apply(null,[...args, callback])
    })
  }
}

将fn进行执行,因为需要进行.then操作,所以需要增加一个回调函数来执行,下面需要在回调函数里面进行resolve()

module.exports = function newpromisfy(fn) {
  return function(...args) {
    return new Promise((resolve, reject) => {
      let callback = function(err, ...args) {
      if (err) {
          reject(err)
        } else {
          resolve(args)
        }
      }
      fn.apply(null,[...args, callback])
    })
  }
}

完工,这个就是手写的一段promisify!!! 最后看看怎么用啊

// newpromise方式
const promisify = require('./newpromisfy')
// const { promisify } = require('util')
const promise = promisify(fun)
promise('test')
    .then(data => {
        console.log(data)
    }, err => {
            console.log('err::', err)
        }
    )

node一下啊,查看运行结果

9f4589621adb823072e559249.png