gpt4 book ai didi

javascript - 尝试理解 Javascript 中的 DRY 原则

转载 作者:行者123 更新时间:2023-12-01 02:28:51 25 4
gpt4 key购买 nike

我目前正在努力提高我的重构技能,我编写了一段代码,其中有两个非常相似的方法,并且我正在努力简化我臃肿的代码,任何建议都是欢迎。

正如您所见,这两种方法非常相似,唯一真正的区别是 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'
});
}

我将这些方法称为事件 block 中的单击函数:

'click [data-fn="authenticate-A"]' : 'authenticateA',
'click [data-fn="authenticate-B"]' : 'authenticateB'

我认为这些可以重构为一种方法或两种更精简的方法,我只是不确定从哪里开始,再次感谢。

最佳答案

您可以拥有一个生成这些函数的函数:

generateAuthFunction : function( authDetails) {
return 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 : authDetails.url,
data : authDetails.dataFunc(this),
complete: function( xhr ) {

if ( xhr.status === 200 )
that.relocate();
else {
$this.text( text ).removeClass("auth-button-disable");
that.handleError( xhr.status );
}
},
dataType : 'json'
});
};
}

然后你可以使用以下命令生成它:

var authDetailsA = {
url : '/A_authentications/update/',
dataFunc : function (this) {
return { _method : 'PUT', sms_token : this.$el.find( '#sms-input' ).val() };
}
};
var authDetailsB = {
url : '/B_authentications/',
dataFunc : function (this) {
return { otp : this.$el.find( '#B-input' ).val() };
};
authenticateA : generateAuthFunction(authDetailsA);
authenticateB : generateAuthFunction(authDetailsB);

你可以像以前一样调用它:

'click [data-fn="authenticate-A"]' : 'authenticateA',
'click [data-fn="authenticate-B"]' : 'authenticateB'

我认为这甚至可能会带来不必要的复杂性,但它更干燥。

关于javascript - 尝试理解 Javascript 中的 DRY 原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com