如何最好地在JavaScript中跨多个方法重构这组重复的触发器调用?

如何最好地在JavaScript中跨多个方法重构这组重复的触发器调用?,javascript,refactoring,Javascript,Refactoring,以下是我的代码: var criterion = _.extends({},Base); criterion.dispatcher.on('save',this.saveIt,this); //respond to event save. criterion.saveIt = function(){ if(this.hasChanged()) this.save({success:this.saveSuccess, error:this.saveError}); //method

以下是我的代码:

var criterion = _.extends({},Base);

criterion.dispatcher.on('save',this.saveIt,this); //respond to event save. 

criterion.saveIt = function(){
 if(this.hasChanged())
   this.save({success:this.saveSuccess, error:this.saveError}); //method in Base 
 else
   dispatcher.trigger('done');
};

criterion.saveSuccess = function() {
 //do something
 dispatcher.trigger('done');
};

criterion.saveError = function() {
 //do something
 dispatcher.trigger('done');
};
对于特定于ajax的项目,有相当多的函数以
dispatcher.trigger('done')
结尾。这用于更新web应用程序上的进度条-在接收到来自每个元素的
done
事件后,无论是成功还是错误,或者当它已经处于新状态时,它都会倒计时。由于计数器是确定性的,它按项目数递增,按接收的
done
s数递减


问题:是否有更好的方法删除每个函数末尾对
dispatcher.trigger('done')
的重复调用?或者这是一种必然的罪恶。我们在各种对象中都有这样的代码,只是为了同步“下一步”的执行(可以将其视为“同步屏障”)。

您可以创建一个自动追加调用的方法

criterion.addProgressMethod = function( methodName, method ) {
   criterion[methodName] = function() {
      method();
      dispatcher.trigger('done');
   }
};

// usage

criterion.addProgressMethod( 'saveSuccess', function() {
   // do something here
} );

我不确定这是否比您现有的更好,但这是一个想法。

您可以创建一个自动追加调用的方法

criterion.addProgressMethod = function( methodName, method ) {
   criterion[methodName] = function() {
      method();
      dispatcher.trigger('done');
   }
};

// usage

criterion.addProgressMethod( 'saveSuccess', function() {
   // do something here
} );

我不确定这是否比你所拥有的更好,但这是一个想法。

基本上就是这样。我希望以某种方式包装类似于AOP的调用,以摆脱记忆中的触发器。我猜在参数的情况下应该是
method.call(这个,参数)
correct?大致上是这样的。我希望以某种方式包装类似于AOP的调用,以摆脱记忆中的触发器。我猜在参数的情况下应该是
方法。调用(这个,参数)
正确吗?