jQuery: Gestione server interno Risposte agli errori
-
25-09-2019 - |
Domanda
Ho una forma in una pagina che aggiunge nuovi dati a un database tramite jQuery. Funziona bene, ma a volte il server craps fuori e ho un 500 (Internal Server Error) , ma è perché il mio server fa schifo.
Il problema è che a volte l'errore del server dopo il PHP rende l'aggiunta al database, ma invece di ottenere un messaggio di successo, ottengo l'errore, anche se l'aggiunta è stata fatta. Così come dovrei andare su questo per assicurarsi che il PHP non aggiunge i dati se ottengo l'errore?
[E sì, io finalmente passare a un nuovo server, ma nessun server è perfetto]
Ecco lo script:
$.ajax({
type: "POST",
url: "/clase/do-add",
data: $("#add").serialize(),
dataType: "json",
timeout: 8000,
beforeSend: function() {
var icon = '<p class="loading-add"></p>'; // loading icon
$('form#add').append(icon);
},
success: function(data) {
if (data.error == true) { // php returns error = true if name is invalid
alert('Invalid name.');
$('form#add').find('p').remove();
} else {
// make the addition
}
},
error: function () {
$('form#add').find('p').remove();
alert('Error. Try again.');
}
});
Soluzione
Si potrebbe avvolgerà ajax chiamata in una funzione e "reqest" la funzione di nuovo in caso di errore.
Qualcosa Linke questo:
jQuery.fn = function yourajaxfunction(){
$.ajax({
type: "POST",
url: "/clase/do-add",
data: $("#add").serialize(),
dataType: "json",
timeout: 8000,
beforeSend: function() {
var icon = '<p class="loading-add"></p>'; // loading icon
$('form#add').append(icon);
},
success: function(data) {
if (data.error == true) { // php returns error = true if name is invalid
alert('Invalid name.');
$('form#add').find('p').remove();
} else {
// make the addition
}
},
error: function () {
$('form#add').find('p').remove();
// ####### i added this:
$(this).yourajaxfunction();
alert('Error. Try again.');
}
});
}
Oppure si potrebbe avere una funzione di inattività che i controlli di nuovo dopo alcuni millisecondi prima di fare eseguire la funzione di nuovo l'errore:
$(this).idle().yourajaxfunction();
funzione Idle usato sopra:
jQuery.fn.idle = function(time){
var o = $(this);
o.queue(function(){
setTimeout(function(){
o.dequeue();
}, time);
});
return o;
};
Ma la cosa migliore è quello di fissare il server .. questa roba è solo hack e patch che compensano un altro problema: il server male. :)
Quindi non è una buona idea per eventuali scenari di produzione.
Altri suggerimenti
si può creare un controllo dell'inserto al database, se l'aggiunta di errore restituito.
...
error: function () {
var fError = function() {
$('form#add').find('p').remove();
alert('Error. Try again.');
};
$.ajax({
type: "GET",
url: "/clase/do-check",
data: {id: id}, // id for check
dataType: "json",
success: function(data) {
if (!data.ok)
fError();
},
error: function () {
fError();
}
});
}
...