1

私はHtml5-js-jqueryでwin8(メトロスタイル)アプリケーションを開発しています。私はこのコードセグメントを持っています。

    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 に答える