2013-10-23 11 views
5

私のコードのさまざまな機能から50以上のAJAX呼び出しがあります。私は、コードの合計サイズを最小化するためにそのVaRのjqXHRを返す関数を作成する方法を考えていますjQueryのAJAX呼び出しを最適化(最小化)する方法

var jqXHR = $.post('/dba/port.php', { 
     mode: "del_wallfunds", 
     pdata: cdata, 
     wname: wName 
    }, 
    function (data) {}, "json") 
    .done(function (data) { 
     var msg = data.msg; 
     if (msg.indexOf("Error") == -1) { 
      alertify.success(msg); 
      delSelected(selGroup); 
     } else { 
      alertify.error(msg); 
     } 
    }) 
    .fail(function() { 
     alertify.error("Error ....."); 
    }); 

:すべてのこれらの呼び出しは、異なるデータ/ URL /コールバックのparamsと類似した構造を有しています。 URL、エラー文字列などのすべての静的変数を渡すのは問題ではありません。しかし、 ".done"のすべてのコールバック関数は異なるで、これらのコールバック関数を変数として渡す方法がわかりません。

1つの方法は.doneで1つの "汎用"関数を呼び出し、その関数に "switch"変数を渡すことですが、それは洗練された解決策ではありません。

どのようにすればよいでしょうか?

おかげ

答えて

4

のどちらかが、あなたの関数呼び出し時に引数としてdoneコールバック関数を渡す:

function ajaxCall(url, data, doneCallback) { 
    return $.post(url, data, doneCallback, "json").fail(...); 
    // or 
    return $.post(url, data, function() {}, "json").done(doneCallback).fail(...); 
} 

var jqXhr = ajaxCall('yoururl.php', {key: 'value'}, function(data) { 
    // do something 
}); 

するか、関数からjqXhrオブジェクトを返し、その後、doneコールバックを割り当てる:

function ajaxCall(url, data) { 
    return $.post(url, data, function() {}, "json").fail(...); 
} 

var jqXhr = ajaxCall('yoururl.php', {key: 'value'}); 
jqXhr.done(function(data) { 
    // do something 
}); 

代わりにjQuery.ajax()を使用して、オプション全体を渡してくださいsの中でオブジェクト:あなたがしようとすることができ

function ajaxCall(options) { 
    return $.ajax(options).fail(...); 
} 

var jqXhr = ajaxCall({ 
    url: 'yoururl.php', 
    data: {key: 'value'}, 
    dataType: 'json' 
}); 
jqXhr.done(function(data) { 
    // do something 
}); 
0

  • ターン
  • 、「拒否された要求」に「要求が正常に処理エラーを返しましたが、」共通「alertify」処理を置きます

    function myAjaxApi(url, data){ 
        var myAjaxCall = $.post(url, data, function (data) {}, "json") 
        .then(function (data) { 
        // using .then : change "request succesful with error state" 
        // to "rejected state" 
         var msg = data.msg; 
         if (msg !== undefined && msg.indexOf("Error") >= 0) { 
          var dfd = $.Deferred(); 
         // try to match the same signature as the "error" option 
          dfd.reject(this, msg); 
          return dfd; 
         } else { 
          return data 
         } 
        }); 
    
        myAjaxCall.done(function(data){ 
         if (data.msg) { 
          alertify.success(data.msg); 
         } 
        }).fail(function (jqxhr, msg) { 
         if (!msg) { msg = "Error ....."; } 
         alertify.error(msg); 
        }); 
        return myAjaxCall; 
    } 
    
    //usage 
    myAjaxApi('/dba/port.php', {mode: "del_wallfunds", pdata: cdata, wname: wName}) 
    .done(function (data) { 
    // the ".done()" queue will not be executed if msg contains "Error" ... 
        delSelected(selGroup); 
    }); 
    
    :ここ

コールバックが、これは与えることができるもののスケッチです

いくつかの部分は注意を払って記述する必要があります。上記の例は、共通のAPIの中で繰り返しAjax呼び出しをラップする方法を示しています。

関連する問題