2013-10-23 16 views
5

Ho più di 50 chiamate AJAX da diverse funzioni del mio codice. Tutte queste chiamate hanno una struttura simile con diversi params dati/url/callback:Come ottimizzare (minimizzare) chiamate 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 ....."); 
    }); 

Sto pensando come scrivere una funzione che sarebbe tornato che var jqXHR per ridurre al minimo la dimensione totale del codice. Non è un problema passare tutte le variabili statiche come URL, stringhe di errore ecc. Ma il problema è che tutte le funzioni di callback su ".done" sono diverse e non so come passare queste funzioni di callback come variabili.

Un modo sarebbe chiamare una singola funzione "universale" su .done e passare una variabile "switch" a quella funzione, ma non sembra essere una soluzione elegante.

Qualche suggerimento su come farlo in modo elegante?

Grazie

risposta

4

In entrambi passano la funzione done di callback come argomento quando si chiama la funzione:

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 
}); 

o restituire l'oggetto jqXhr dalla funzione, e assegnare il done richiamata poi:

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

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

In alternativa, passare invece a utilizzare jQuery.ajax() e passare l'intera opzione s oggetto:

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

si può provare a:

  • turno "richiesta restituito con successo un errore di trattamento" in una "richiesta rifiutata",
  • mettere il "alertify" trasformazione in un comune callback

Ecco uno schizzo di ciò che questo potrebbe dare:

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); 
}); 

Alcune parti devono essere scritte con maggiore attenzione; l'esempio di cui sopra ha lo scopo di illustrare come è possibile avvolgere le chiamate ajax ripetute all'interno di una API comune.

Problemi correlati