实现一个promisify函数

·  阅读 2767

promisify的作用

将原本需要通过传入回调参数来实现回调执行(或者叫同步执行)改为利用promise.then的方式来调用,从而实现逻辑上的同步操作。

代码实现

function promisify(func) {
  return function (...args) {
    return new Promise( (resolve, reject) => {
      let callback = function(...args) {
        resolve(args)
      }
      // 给func函数主动塞入一个callback,这样在func中调用callback的时候实际执行的时候就是
      // 我们这里定义的callback函数,然后在我们的callback中调用resolve,
      // 这样一来,本来想要通过回调执行的操作就可以放在then函数中进行执行了
      func.apply(null, [...args, callback])
    })
  }
}

复制代码

使用实例

// foo 可以是任何需要调用回调函数的函数
function foo (str1, str2, callback) {
  setTimeout( () => {
    console.log('setTimeout')
    // callback函数是通过最后一个参数这个位置来识别的,与callback这个名字无关
    callback(str1, str2)
  }, 1000)
}

// 这里的agent已经不是foo函数,而是我们在promisify中返回的自定义匿名函数
// 所以不需要纠结是否传入callback函数。
let agent = promisify(foo)

agent('hello', 'world')
  .then( res => {
    console.log(res)
  })
复制代码

输出结果

setTimeout
[ 'hello', 'world' ]
复制代码

总结

promisify在实际开发过程中还是比较有用的,希望对大家有所帮助。

分类:
前端
标签:
分类:
前端
标签: