2011-05-03 36 views
8
$("#submit").click(function() { 
    var boolError = false; 

    CheckForm("#email"); 
    CheckPhone("#phone"); 

    if (boolError == true) { 
     console.log('error'); 
    } else { 
     console.log('here'); 
     // $("#form").submit(); 
    } 
}); 

problema es que siempre devuelve console.log('here');Cómo esperar la respuesta antes de elegir JQUERY AJAX condición

¿Hay una manera de esperar a que checkForm y CheckPhone. AJAX llamada de función checkForm:

$.ajax({ 
    type: "POST", 
    url: "/webservice/user.asmx/CheckForm", 
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    error: function (XMLHttpRequest, textStatus, errorThrown) { }, 
    success: function (data) { 
     var obj = data.d; 
    } 
}); 

Respuesta

16

intente configurar async false: (Ver Editar A continuación)

$.ajax({ 
    type: "POST", 
    async: false, 
    url: "/webservice/user.asmx/CheckForm", 
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    error: function (XMLHttpRequest, textStatus, errorThrown) { }, 
    success: function (data) { 
     var obj = data.d; 
    } 
}); 

Esto hará que el bloqueo para que el navegador va a esperar a que termine antes de continuar llamada AJAX. Por supuesto, todavía no estoy seguro de cómo se relaciona eso con el booleano que se verifica en el condicional principal. Tal vez hay código que no nos estás mostrando ...


Editar: ::: ::: suspiro yo era joven y tonto cuando me envió esta respuesta, y de hecho había olvidado de ella. Mantengo la información anterior sin cambios con fines históricos (ya que parece haber ayudado a algunas personas, o al menos creen que sí), pero entiendo que esto es no es un enfoque correcto.

Realizar llamadas asincrónicas sincrónicas y bloquear la ejecución es en todos los sentidos incorrecto. No lo hagas En su lugar, estructure la lógica para responder a las operaciones asincrónicas. En el caso de esta pregunta, las llamadas al console.log() deberían estar ocurriendo en el controlador de éxito (o error) de la llamada AJAX, no en el código después de la invocación de esa llamada.

7

Tienes que hacer esto en la devolución de llamada de la llamada AJAX - como esto:

$.ajax({ 
    type: "POST", 
    url: "/webservice/user.asmx/CheckForm", 
    data: "{'type':'" + var_type + "', 'value':'" + var_value + "'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    error: function (XMLHttpRequest, textStatus, errorThrown) { 
     console.log('error'); 
    }, 
    success: function (data) { 
     console.log('here'); 
    } 
}); 

El uso de AJAX requiere la programación no lineal - Abundan las devoluciones de llamada.

Puede establecer la opción en la llamada ajax que lo hace no asincrónico (es decir, jQuery esperará a que termine) pero esto hará que su aplicación/sitio web no funcione tan bien.

+0

correcta. El uso de devoluciones de llamadas es imprescindible al programar JavaScript y AJAX. – Tadeck

1

Sí, pones el condicional dentro de la función de éxito.

success: function (data) { if (...) { } else { }   

var obj = data.d; 
    } 
1

donde establece boolError=true ?? por qué siempre regresa aquí;

u debe cambiar la lógica de este tipo en checkForm

$.ajax({ 
    type: "POST", 
    error: function (XMLHttpRequest, textStatus, errorThrown) { boolError==true;}, 
    success: function (data) { 
     var obj = data.d; 
    } 
}); 
Cuestiones relacionadas