1

这是我拥有的代码:

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');
};

有很多以dispatcher.trigger('done')ajax 特定项目结尾的函数。done这用于更新网络应用程序上的进度条 - 它在从每个元素接收到成功或错误或已经处于新状态的事件后倒计时。由于计数器是确定性的,它按项目数向上计数,并按done接收到的 s 数向下计数。

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

4

1 回答 1

1

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

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

// usage

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

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

于 2012-08-09T19:26:41.583 回答