如何用TypeScript Promise替代jQuery Deferred重构类B代码?
重构JQueryDeferred为TypeScript Promise
问题背景
原有代码基于JQueryDeferred实现异步逻辑,现在需要迁移到TypeScript原生Promise。已完成类A的重构,但类B的代码因Promise无法直接从外部调用resolve()而陷入困境。
原有JQueryDeferred代码
class A { private b: B = new B(); // 修正原代码中class B的语法错误 public function1(param:string):JQueryDeferred<object> { var obj: JQueryDeferred<object> = $.Deferred(); b.registerFunction1(obj); if(param) { // 其他条件判断逻辑 obj.resolve(); } return obj; } } class B { public registerFunction1(obj:JQueryDeferred<object>): void { domhandler.addEventListener(dom, 'onFunction1', this.onFunction1.bind(this, obj)); } public onFunction1(obj:JQueryDeferred<object>, evt:KeyboardEvent):void { obj.resolve(evt); } }
已完成的类A重构代码
class A { private b: B = new B(); public function1(param:string):Promise<object>{ return new Promise((resolve, reject) => { // 原传递Promise对象的方式不可行,需修改此处逻辑 b.registerFunction1(resolve); if(param){ // 其他条件判断逻辑 resolve(); } }); } }
类B的重构方案
TypeScript Promise的resolve()方法仅能在Promise构造函数的回调内部直接调用,无法通过传递Promise实例从外部触发。核心思路是传递resolve函数本身给类B,而非传递Promise实例。
重构后的类B代码:
class B { // 修改参数类型为resolve函数 public registerFunction1(resolve: (value: object) => void): void { // 绑定事件时,将resolve函数预先作为参数传入事件处理函数 domhandler.addEventListener(dom, 'onFunction1', this.onFunction1.bind(this, resolve)); } // 事件触发时调用resolve函数完成Promise public onFunction1(resolve: (value: object) => void, evt:KeyboardEvent):void { resolve(evt); } }
完整重构后代码
class A { private b: B = new B(); public function1(param:string):Promise<object>{ return new Promise((resolve, reject) => { b.registerFunction1(resolve); if(param){ resolve(); } }); } } class B { public registerFunction1(resolve: (value: object) => void): void { domhandler.addEventListener(dom, 'onFunction1', this.onFunction1.bind(this, resolve)); } public onFunction1(resolve: (value: object) => void, evt:KeyboardEvent):void { resolve(evt); } }
关键说明
- JQueryDeferred是可外部触发的异步容器,而Promise采用内部决议的设计模式,因此不能直接照搬传递实例的逻辑,必须传递决议函数(resolve/reject)。
- 通过
bind方法将resolve函数预先绑定到事件处理函数的参数中,确保事件触发时能正确调用resolve完成Promise。
内容的提问来源于stack exchange,提问作者Itsme
相关产品推荐
相关产品推荐

