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

时间:2012-08-09 19:20:24

标签: 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 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数量向下计数。

问题:还有更好的方法可以在每个功能结束时删除对dispatcher.trigger('done')的重复调用吗?或者这是一个必要的邪恶。我们在各种对象中都有这样的代码,只是为了同步“下一步”的执行,可以这么说(把它想象成'同步障碍')。

1 个答案:

答案 0 :(得分:1)

您可以创建一个自动附加呼叫的方法。

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

// usage

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

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