2012-08-09 10 views
1

這裏是我的代碼:如何在JavaScript中通過多個方法重構這組重複的觸發器調用?

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的具體項目的一些功能。這用於更新Web應用程序上的進度條 - 在成功或錯誤或已處於新狀態時從每個元素接收到done事件後,它會倒計時。由於計數器是確定性的,因此它計數的項目數量減少了收到的數量done

問題:有沒有更好的方法來刪除每個函數結束時重複調用dispatcher.trigger('done')?或者這是一個必要的罪惡。我們在各種對象中都有這樣的代碼,只是爲了同步「下一步」的執行(可以說是「同步障礙」)。

回答

1

您可以創建一個自動附加呼叫的方法。

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

// usage 

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

我不確定這是否比你有更好的,但它是一個想法。

+0

非常符合這些方面。我希望以某種方式包裝類似於AOP的電話,以擺脫記住觸發器的記憶。我猜如果是參數,它會是'method.call(this,arguments)'正確嗎? – PhD 2012-08-09 19:42:03

+0

@PDD我相信如此。 – dqhendricks 2012-08-09 19:45:48

相關問題