You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:45:14