如何降低此函数的复杂性,该函数根据数据类型进行回调
How can I decrease the complexity of this function that calls back depending on data-type?
我正在调整我的身份验证JavaScript模块,这样我就可以使用一个JavaScript类挂钩.js-auth-ui
来处理我的web应用程序的身份验证,同时使用数据类型属性来引用正确的函数。
在扫描DOM中的js钩子后,我将通过如下所示的init函数运行它,该函数反过来运行一个exec函数,该函数调用回正确的函数。
我想知道是否有一种更有效的方法可以在没有其他if的情况下编写execAuthUi函数,根据我的linting规则,这会增加它的"复杂性"评级。
const execAuthUi = function ( $element ) {
const data = $element.data();
if (data.type === "account-login-form") {
authLoginEmail( $element, data );
} else if (data.type === "account-logout") {
authLogout( $element );
} else if (data.type === "account-reset") {
authReset( $element );
} else if (data.type === "account-signup-form") {
authSignup( $element );
}
};
const initAuthUi = function ( ) {
const $notLoaded = $_jsElements.not( ".is-initialized" );
let $element = null;
let i = $notLoaded.length;
for ( i; i--; ) {
$element = $_jsElements.eq( i );
$element.addClass( "is-initialized" );
execAuthUi( $element );
}
};
使用对象映射类型回调:
var callbackMap = {
'account-login-form': authLoginEmail.bind(null, $element, data),
'account-logout': authLogout.bind(null, $element),
...
};
callbackMap[data.type] && callbackMap[data.type]();
您可以在"Switch"语句中编写它,而不是使用多个elseif。
我会做一些类似的事情
switch(data.type) {
case "account-login-form":
authLoginEmail( $element, data );
break;
case "account-logout":
authLogout( $element );
break;
case "account-reset":
authReset( $element );
break;
case "account-signup-form":
authSignup( $element );
break;
}
如果您的方法不满足任何这些要求,也可以使用"默认"情况。
您可以进行切换并将检查移到可重用的位置。
const dataTypeAccountLoginForm = "account-login-form";
const dataTypeAccountLogout = "account-logout";
const dataTypeAccountReset = "account-reset";
const dataTypeAccountSignupForm = "account-signup-form";
const execAuthUi = function(ele){
var data = ele.data();
switch(data.type) {
case dataTypeAccountLoginForm:
authLoginEmail(ele, data);
break;
case dataTypeAccountLogout:
authLogout(ele);
break;
case dataTypeAccountReset:
authReset(ele);
break;
case dataTypeAccountSignupForm:
authSignup(ele);
break;
}
}
另一种选择是抽象逻辑abit。就个人而言,我认为这样做有点过头了。
var dataTypeAccountLoginForm = "account-login-form";
var dataTypeAccountLogout = "account-logout";
var dataTypeAccountReset = "account-reset";
var dataTypeAccountSignupForm = "account-signup-form";
var uiFunctions = [{
key : dataTypeAccountLoginForm,
func : authLoginEmail
},
{
key : dataTypeAccountLogout,
func : authLogout
},
{
key : dataTypeAccountReset,
func : authReset
},
{
key : dataTypeAccountSignupForm,
func : authSignup
}];
var execAuthUi = function(ele){
var data = ele.data();
for (var i = 0; i < uiFunctions.length; i++) {
if (uiFunctions[i].key === data.type){
uiFunctions[i].func(ele,data);
return;
}
}
};
或者你可以使用地图功能。
var dataTypeAccountLoginForm = "account-login-form";
var dataTypeAccountLogout = "account-logout";
var dataTypeAccountReset = "account-reset";
var dataTypeAccountSignupForm = "account-signup-form";
var uiFunctions = [
{
key : dataTypeAccountLoginForm,
func : authLoginEmail
},
{
key : dataTypeAccountLogout,
func : authLogout
},
{
key : dataTypeAccountReset,
func : authReset
},
{
key : dataTypeAccountSignupForm,
func : authSignup
}
];
var execAuthUi = function(ele){
var data = ele.data();
uiFunctions.map(function(obj){
if (obj.key === data.type)
obj.func(ele,data);
});
};
相关文章:
- javascript解释器如何理解变量的数据类型
- 从查询字符串参数推断出正确的数据类型
- 为什么不'我们在javascript中使用函数参数的数据类型
- 基于数据类型的编辑框的汇总列表
- 如何降低此函数的复杂性,该函数根据数据类型进行回调
- 比较和分配数据类型的困难
- 在javascript中调用函数/对象引用时,可容纳任何数据类型
- E4X中是否有一种方法可以将基元数据类型的XMLList转换为类似于Array.join()的Array
- 为什么或者为什么不缩写某些数据类型的核心函数
- canvas' toDataURL() 函数可能的数据类型是什么?
- 什么是函数的数据类型:函数还是对象?在 JavaScript 中
- 我如何使用自定义“;类“;(函数)作为javascript中的数组数据类型
- 测试函数参数的数据类型的正确性
- 将变量数据类型解析为一个函数,该函数在JavaScript中包含对数据类型的条件检查
- 同一个函数参数能接受不同的数据类型吗?
- 是否可以说JS函数可以是数据类型?
- 当用于ajax调用webservice的数据类型为json "时,如何将成功函数的结果与字符串进行比较
- Javascript函数派生" smallst& quot;数据类型
- 为什么此函数无法计算给定参数的数据类型
- 未捕获的类型错误:未定义不是函数-数据表