1

我正在使用 Html5-js-jquery 开发 win8(metro 风格)应用程序。我有这个代码段;

    GetBoutiqueDetail: function (boutiqueId, options) {
        if (IsUserLogin()) {
            //different job A
        } else {
            ShowLoginPanel(undefined);
        }
    },
    GetProductDetail: function (boutiqueId, productId, options) {
        if (IsUserLogin()) {
            //different job B
        } else {
            ShowLoginPanel(undefined);
        }
    },
    AddBasket: function (productId, productVariantId, quantity, options) {
        if (IsUserLogin()) {
            //different job C
        } else {
            ShowLoginPanel(undefined);
        }
    },....

.并且~20个函数应该检查用户是否登录。我应该调用类似于“ Library.GetBoutiqueDetail(); ”的函数

所以我的问题很简单,我如何重构该代码以删除这些 if-else 部分?

4

5 回答 5

2

这个对象映射怎么样:

var objMap = {  
  "GetBoutiqueDetail":fnJobA,
  "GetProductDetail":fnJobB,
  "AddBasket":fnJobC}
  ....
}

if (loggedIn) {
  objMap[task]();
}
else {
  doLogin();
}
于 2012-12-11T13:30:12.897 回答
2

尝试这样的事情:

checkLogin: function( action, actionArgs ) {

    if( IsLogin ) {

        return action.apply(this, actionArgs );
    }

    ShowLoginPanel();
},

GetBoutiqueDetail: function (boutiqueId, options) {

    //different job A
},
GetProductDetail: function (boutiqueId, productId, options) {

    //different job B
},
AddBasket: function (productId, productVariantId, quantity, options) {

    //different job C
}
于 2012-12-11T13:34:31.763 回答
1

在 Javascript 中,您可以从函数返回以结束它,所以 f.ex:

GetProductDetail: function (boutiqueId, productId, options) {
    if (!IsLogin) return ShowLoginPanel();
    // different job...
}

不过,您仍然会有一些重复的代码。另一种选择是定义更高级别的功能。就像是:

var loginOrAction = function() {
    if (!IsLogin) return ShowLoginPanel();
    var args = [].slice.call(arguments);
    Library[args.shift()].apply(Library, args);
}

loginOrAction('GetBoutiqueDetail', boutiqueId, options);
于 2012-12-11T13:34:07.040 回答
1

您始终可以将公共代码包装到更高范围的函数中,并从库函数中调用它 - 例如:

//Higher scope:
function CheckForLogin(executionFunction)
{
   if(IsLogin) {
      executionFunction();
   } else {
      ShowLoginPanel(undefined);
   }
};


GetBoutiqueDetail: function (boutiqueId, options) {
    CheckForLogin(//different job A)
}

different job 'N'作为匿名函数传入CheckForLogin

于 2012-12-11T13:35:33.400 回答
-2

使用三元运算符

(IsLogin) ? jobA() : ShowLoginPanel(undefined)
于 2012-12-11T13:30:37.383 回答