手动实现一个promisify函数
手动实现一个promisify函数?刚刚看到这个问题的时候愣了一下。一开始的理解是手动实现一个 Promise。脑海中就在想Promise 有哪些方法,有哪几个阶段,不同的方法怎么去实现...
其实不然
手动实现一个promisify函数的意思是:我们把一个异步请求的函数,封装成一个可以具有 then方法的函数,并且在then方法中返回异步方法执行结果的这么一个函数。
实现
OK, 既然需求已经理解了,那就开始动手实现吧。
需求分析:
- 具有 then 方法
- 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)
})
}
}