【发布时间】:2015-04-01 23:42:15
【问题描述】:
我目前正在努力提高我的重构技能,我编写了一段代码,其中有两种非常相似的方法,我正在努力简化我臃肿的代码,任何建议都是欢迎。
如您所见,这两种方法非常相似,唯一真正的区别是 POST 到的 URL。
authenticateA : function( e ) {
var $this = $( e.target ).closest( '[data-fn]' )
, text = $this.text()
, that = this;
$this.text( 'Authenticating...' ).addClass("auth-button-disable")
$.ajax({
type : 'POST',
url : '/A_authentications/update/',
data : { _method : 'PUT', sms_token : this.$el.find( '#sms-input' ).val() },
complete: function( xhr ) {
if ( xhr.status === 200 )
that.relocate();
else {
$this.text( text ).removeClass("auth-button-disable");
that.handleError( xhr.status );
}
},
dataType : 'json'
});
},
authenticateB : function( e ) {
var $this = $( e.target ).closest( '[data-fn]' )
, text = $this.text()
, that = this;
$this.text( 'Authenticating...' ).addClass("auth-button-disable")
$.ajax({
type : 'POST',
url : '/B_authentications/',
data : { otp : this.$el.find( '#B-input' ).val() },
complete: function( xhr ) {
if ( xhr.status === 200 )
that.relocate();
else {
$this.text( text ).removeClass("auth-button-disable");
that.handleError( xhr.status )
}
},
dataType : 'json'
});
}
我将这些方法称为事件块中的点击函数:
'click [data-fn="authenticate-A"]' : 'authenticateA',
'click [data-fn="authenticate-B"]' : 'authenticateB'
我认为这些可以重构为一种方法或两种更精简的方法,我只是不确定从哪里开始,再次提前感谢。
【问题讨论】:
-
将两种方法重构为一种方法的关键是确定两者之间的区别是什么,这些区别可以在函数参数中指定,还是从 dom 元素中指定。作为一个起点,似乎 url 和类型是不同的,这些值可以来自
-
将 ajax
complete方法与200一起使用是多余的。只需使用done方法。complete方法也已弃用。 -
complete参数is not deprecated的使用。$.ajax({}).complete(),方法,就是。 -
这个问题太笼统了。如您所见,有多种方法可以做到这一点。我认为这更适合codereview.stackexchange.com
标签: javascript jquery performance backbone.js dry