手动实现一个promisify函数

844 阅读2分钟

手动实现一个promisify函数

手动实现一个promisify函数?刚刚看到这个问题的时候愣了一下。一开始的理解是手动实现一个 Promise。脑海中就在想Promise 有哪些方法,有哪几个阶段,不同的方法怎么去实现...

其实不然

手动实现一个promisify函数的意思是:我们把一个异步请求的函数,封装成一个可以具有 then方法的函数,并且在then方法中返回异步方法执行结果的这么一个函数。

实现

OK, 既然需求已经理解了,那就开始动手实现吧。

需求分析:

  1. 具有 then 方法
  2. then 方法里返回异步接口执行结果

其实这个跟我们平时使用 Promise 没什么区别,我们只需要在封装的方法里返回一个 Promise,然后只需要我们处理好相应的参数传递就 OK 了。

Coding

// 首先定一个需要进行 promisify 的函数
function asyncFn(a, b, callback) {
        // 异步操作,使用 setTimeout 模拟
        console.log('异步请求参数', a, b)
        setTimeout(function() {
                callback('异步请求结果')
        }, 3000)
}

// 我们希望调用的方式是
const proxy = promisify(asyncFn)
proxy(11,22).then(res => {
        // 此处输出异步函数执行结果
        console.log(res)
})

// 定义一个方法, 需要针对异步方法做封装,所以需要一个入参,既需要promisify的原异步方法
function promisify( asyncFn ) {
        // 方法内部我们需要调用asyncFn方法,并传递原始参数,所以需要返回一个方法来接收参数
        return function(...args) { // 由于需要接收参数,所以参数我们可以写为...args
                // 我们需要执行异步操作,并返回一个结果,所以返回一个 promise实例
                return new Promise(resolve => {
                        // asyncFn 需要执行一个回调,所以定义一个回调方法
                        const callback = function(...args) {
                              resolve(args)
                         }
                        args.push(callback)
                        asyncFn.apply(null, args)
                })
        }
}