Sto eseguendo una convalida sui dati del modulo, in modo tale che quando qualcuno preme il pulsante di invio controlla prima i contenuti del modulo. Un numero di campi (potrebbe essere zero, potrebbe essere più di uno, a seconda della pagina) hanno cose come codici univoci che richiedono prima il controllo con il server. Sto eseguendo una richiesta asincrona al server, che risponde semplicemente 'ok
' o 'taken
' per ogni campo. Se uno qualsiasi dei campi ha errori, la pagina non viene inviata.jQuery AJAX: raccolta di più risultati asincroni
Da un lato, questo dovrebbe essere asincrono: dovrebbe continuare a convalidare il resto dei campi del modulo mentre quella richiesta è inattiva, compreso l'attivazione di altre richieste. Se la chiamata viene effettuata in modo sincrono, rallenta visibilmente il feedback sui campi successivi.
D'altra parte, desidero assicurarmi che tutte le richieste di convalida siano ritornate (o scadute) prima di rispondere sì o no al metodo validate()
e consentire al submit di procedere o meno. Pertanto, se sono necessari due campi che richiedono la convalida, il metodo validate()
deve attivare queste due richieste AJAX, elaborare il resto dei campi e quindi attendere fino a quando queste due richieste non sono tornate prima di tornare definitivamente.
Probabilmente riuscirò a farlo con qualche brutta soluzione homebaked (probabilmente coinvolgendo una serie di ID casuali che rappresentano le richieste in corso o qualcosa del genere), ma prima di farlo c'è qualche funzione incorporata, plugin o tecnica standard che dovrei essere usando invece?
Chiarimento
Quello che penso che ho bisogno è quello di rendere il codice di attesa per il risultato da uno o più asincrone le richieste prima di procedere con un metodo. Questo non è lo stesso di un callback, perché il risultato del metodo dipende dal risultato delle richieste. Non è la stessa di una richiesta sincrona perché potrebbero esserci più di una di esse.
sto usando questo per controllare il modulo prima di inviarlo:
$("form").submit(function() {
return validate($(this));
});
Se il metodo validate()
restituisce false, allora la forma non inviare. validate()
elimina tutti i campi che non sono accettati. Per i campi normali, validate()
sembra qualcosa di simile (versione notevolmente semplificata, senza il feedback):
function validate(form) {
resetWarnings(form);
var ok = true;
// required fields
form.find("input.required").each(function() {
var field = $(this);
if (field.val() === "") {
ok = false;
}
return this; // meaningless in this case but a good habit to keep
});
// fields that matches a pattern
form.find("input.pattern").each(function() {
var field = $(this);
var pattern = field.data("pattern");
if (!field.val().match(pattern)) {
ok = false;
}
return this;
});
// various other rules for other sorts of field
...
return ok;
}
Per i campi di AJAX è più simile a questo:
form.find("input.lookup").each(function() {
var field = $(this);
var url = field.data("lookup");
$.ajax({
url: url,
data: { code: field.val() },
success: function (result) {
if (result === "taken") {
ok = false;
}
}
}
});
Ma, naturalmente, validate()
è già finito prima il metodo di successo è chiamato. Quindi, se riesco a farlo attendere fino a quando l'ajax non è stato completato (sia successo che errore) prima di tornare, posso ottenere il risultato giusto e interrompere la presentazione del modulo. E se ho fatto l'ajax sincrono, allora l'intero metodo si ferma finché non è finito, il che è sbagliato.
ulteriori riflessioni
Dato modello di threading di Javascript (cioè nessuno), è quello che sto chiedendo tecnicamente impossibile?
Non è una sequenza di campi unici identici, ma la possibilità che più di un campo su un modulo abbia bisogno di controllo sul lato server - a URL diversi, rispetto a controlli diversi. In realtà, il bit multiplo non è ciò che è importante: sta facendo in modo che il metodo validate() attenda un risultato asincrono. L'unica ragione per cui sottolineo che potrebbe esserci più di un campo è che fare una singola chiamata sincrona non è una risposta valida. –
Vedi chiarimenti. –
Non sono sicuro di quello che sto chiedendo è possibile. Convalidare i campi mentre l'utente completa il modulo potrebbe finire per essere l'unico modo. –