Actualmente estoy validando algunas entradas en el lado del cliente. Cuando el usuario envía el formulario, quiero verificar los valores de las entradas del formulario, y luego hacer algo una vez que todas las verificaciones estén completas
$('form').submit(function() {
var input1 = $('form #input1');
var input2 = $('form #input2');
//validate both input values
validate_input(input1);
validate_input(input2);
//wait until all validation complete to execute code here
return false;
});
Aquí, la función "validate_input" verificará el valor de entrada. Si pasa las verificaciones iniciales (como la longitud de los caracteres), realizará una solicitud AJAX para una validación adicional (por ejemplo, verificar si se toma el nombre de usuario). Algo como esto:
function validate_input(input){
value=input.val();
if (value.length<4){
//code to execute if input is too short
}
else {
$.ajax({
type: 'get',
url: check_input_url,
data: input.serialize(),
success: function(data){
if (data=="invalid") {
//code to execute if invalid
} else {
//code to execute if valid
}
}
});
}
}
Actualmente estoy usando las funciones jQuery.when () y .done (), pero la función done () no espera hasta que todas las funciones validate_input estén completas (incluidas las devoluciones de llamada AJAX llamadas desde validate_input)
$.when(
validate_input(input1),
validate_input(input2)
).done(function(){
//code here
});
¿Cómo esperaría hasta que todas las funciones validate_input estén completas (terminadas con posibles devoluciones de llamada AJAX), antes de ejecutar más código?
3 respuestas
No veo que la función validate_input
devuelva nada. Si quiere esperar, debe devolver una promesa, para no pasar undefined
a $.when()
:
function validate_input(input){
var value=input.val();
if (value.length<4){
return …; //code to execute if input is too short
} else {
return $.ajax({
// ^^^^^^
…
});
}
}
ACTUALIZACIÓN: acabo de actualizar mi respuesta. ahora es más probable que se ajuste a sus necesidades. He agregado un parámetro a la función de devolución de llamada.
Usar devoluciones de llamada con funciones anónimas y encadenarlas:
1. agregue un parámetro para la función de devolución de llamada y la llamada a la función de devolución de llamada:
function validate_input(input, callback){
value=input.val();
if (value.length<4){
//code to execute if input is too short
callback(false);
}
else {
$.ajax({
type: 'get',
url: check_input_url,
data: input.serialize(),
success: function(data){
if (data=="invalid") {
//code to execute if invalid
callback(false);
} else {
//code to execute if valid
callback(true);
}
}
});
}
}
2. cuando llame a su función varias veces, encadénela con funciones anónimas (que se ejecutan después de success
en su $.ajax
: la solicitud se ha activado):
$('form').submit(function() {
var input1 = $('form #input1');
var input2 = $('form #input2');
//validate both input values
validate_input(input1, function(result){
if(result == true)
{
validate_input(input2, function(result){
if(result == true)
{
//wait until all validation complete to execute code here
}
else
{
return false;
}
});
}
else
{
return false;
}
});
});
var inputsLength = 0, // or maybe set it to $('form input').length
inputsReady = 0;
function checkInputsValidation(){
if (++inputsReady === inputsLength) YOURSALLINPUTSAREVALIDFUNCTION();
}
function validate_input(input){
inputsLength++; // remove it if you already set inputsLength
// blablabla
$.ajax({
type: 'get',
url: check_input_url,
data: input.serialize(),
success: function(data){
if (data=="invalid") {
//code to execute if invalid
} else {
checkInputsValidation();
}
}
});
}
Preguntas relacionadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.