如何将父类回调类方法Promise化,供子类async-await方法调用
核心问题说明
你提供的两种Promise化思路本质都是正确的,原有写法的问题出在this指向丢失和函数调用逻辑错误两个点上,以下是修正后的实现方案:
方案1:自定义Promise化工具
你的自定义实现有两个可修正点:
promisify本身返回Promise,不需要额外加async修饰符- 需要额外处理函数执行的上下文绑定,保证父类方法内部可以正常访问子类实例属性
正确实现代码
// 通用promisify工具,fn为要转换的回调方法,context为方法执行的this指向 function promisify(fn, context) { return function(...args) { return new Promise((resolve, reject) => { // 绑定上下文执行原方法,将回调作为最后一个参数传入 fn.call(context, ...args, (err, data) => { if (err) return reject(err) resolve(data) }) }) } }
调用示例
try { // 传入父类getToken方法,绑定当前子类实例作为执行上下文 const getTokenAsync = promisify(this.getToken, this) let tokens = await getTokenAsync() refreshToken = tokens.refresh_token } catch (err) { // 异常处理逻辑 }
方案2:使用Node.js内置util.promisify
你原有写法的问题是没有绑定实例上下文,导致getToken执行时内部this指向错误,修正后写法如下:
const util = require('util') // promisify后绑定当前子类实例作为执行上下文 const asyncGetToken = util.promisify(this.getToken).bind(this) try { let tokens = await asyncGetToken() refreshToken = tokens.refresh_token } catch (err) { // 异常处理逻辑 }
关于子类实例访问的说明
只要按照上述写法正确绑定this,getToken方法内部的this指向就是当前正常的子类实例,可以正常访问实例上的所有属性和方法,不会出现上下文异常的问题。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

