3

jQuery ajax リクエストでは、コールバックで発生するエラー処理があります。

success: function(a) {
    if (a.error) switch (a.error) {
    case "formError":
    case "clientError":
    case "limitError":
        doErrorCorrection();
        alert("Client-sided error: " + a.errorMessage);
        break;
    case "serverError":
    case "500Error":
        doRollback();
        doTransactions();
        break;
    case "generalError":
        alert("One plus one is: " + (1+1));
    } else doActionsWith(a)
}

これを次のような独自のオブジェクトに移動したいと思います。

var errors = {
    ...
    formError: function() {...},
    generalError: function() {...},
    ...
};

それで、私は言うことができます:

success: function(a) {
    if (a.error) return errors[a.error](a.errorMessage);
    doActionsWith(a)
}

問題は、スイッチからの大量のリフローがあることです。これをオブジェクトに変換すると、同じ機能が何度も繰り返されることになります。

var errors = {
    formError: function() { methodA() },
    clientError: function() { methodA() },
    limitError: function() { methodA() },
    ...
    //more if I had more reflows
};

そこで、配列/リストをインデックスとして使用することを考えました。私は次のようなインデックスを設定することをいじりました:

var arr = {
    test: 'hello world'
};

var index = ['a', 'b', 'c'];

arr[index] = 'array as index';

それは機能しましたが、部分的にしか機能しませんでした。キーを実行すると、文字列として返されました。

for (var key in arr) console.log(key)
//test
//a,b,c

オブジェクトで同じテストを実行しindex = {'a' = true}、文字列インデックスのみを に設定しobject Objectますarray as index

さて、インデックスとしての配列/オブジェクトは機能しません。スイッチをオブジェクトに再構築するにはどうすればよいですか?

4

2 に答える 2

1

配列をオブジェクト プロパティ名として使用すると、それらは同等の文字列に変換されるため、[1,2,3]として使用され"1,2,3"ます。「値がこれらの値のいずれかである場合」のようには機能しません。

特定の問題については、次のような専用のエラー ハンドラー オブジェクトを作成します。

function ErrorHandler(map, handlers)
{
    this.map = map;
    this.handlers = handlers;
}

ErrorHandler.prototype.handle = function(a) {
    var handler = this.handlers[this.map[a.error]];

    if (handler) {
        handler(a);
    }
}

コンストラクターは、エラー マップと処理関数を受け取ります。が.handle()呼び出されると、ハンドラが検索されて実行されます。これをインスタンス化する方法は次のとおりです。

var myHandler = new ErrorHandler({
    "formError": "clientError",
    "clientError": "clientError",
    "limitError": "clientError",
    "serverError": "serverError",
    "500Error": "serverError"
    "generalError": "genericError"
}, {
    clientError: function(a) {
        doErrorCorrection();
        alert("Client-sided error: " + a.errorMessage);
    },
    serverError: function(a) {
        doRollback();
        doTransactions();
    },
    genericError: function(a) {
        alert("One plus one is: " + (1+1));
    }
});

使用するには:

success: function(a) {
    if (a.error) {
        myHandler.handle(a);
    } else doActionsWith(a)
}
于 2013-08-26T08:14:59.293 に答える
1

次のようなオブジェクトの配列を維持できます。

var arr = [{ 
    msg: 'Hello World',
    val: ['a', 'b', 'c']
}, {
    msg: 'This is a dummy text.',
    val: ['d', 'e', 'f']
}];

// now perform your search
for (var obj in arr) {
    var idx = arr[obj].val.indexOf('a');
    if (idx !== -1) { // if val is found
        alert(arr[obj].msg);    // alerts "Hello World"
    }
}
于 2013-08-26T08:20:01.997 に答える