callback与promisify

134 阅读1分钟

promisify的概念

将原本需要通过传入回调参数函数来实现回调执行(或者叫同步执行)改为promise的.then的方式来调用

例子

实现一个把字符串类型转为数字一个函数。然后你通过一系列骚操作写出下面代码。

function strToNumb(str, callback) {
  if (typeof str !== "string") {
    console.log('锁力啦(sorry),我只识别字符串类型!!!')
    return false
  }
  // 由于某个原因,我不能立即给你返回 - 延迟一秒后返回 
  let result = Number(str)
  setTimeout(() => {
    callback(result)
  }, 1000)
}

// 测试
let str = "123"
strToNumb(str,(result)=>{
	// 拿到转化成功的结果
    console.log(result)
})

突然有一天更改了需求,想通过promise来写,但是又不想改以前的,于是找到了promisify实现思路。

function strToNumb(str, callback) {
  if (typeof str !== "string") {
    console.log('锁力啦(sorry),我只识别字符串类型!!!')
    callback("error")
    return false
  }
  // 由于某个原因,我不能立即给你返回 - 延迟一秒后返回 
  let result = Number(str)
  setTimeout(() => {
    callback(result)
  }, 1000)
}

let promisify = (target) => {
  return function (...args) {
    return new Promise((res, rej) => {
      let proxyFn = (value) => { // 做一层代理函数等待回调执行
        res(value)
      }
      target.apply(this, [...args, proxyFn])
    })
  }
}

let agent = promisify(strToNumb)
agent('996').then(res => {
  console.log("目标值 =====> ", res);
})

总结

以上就是promisify功能实现以及大体作用。