Pregunta

Lo que estoy tratando de hacer implica pasar por una serie de casillas de verificación.

Para cada uno de ellos que se comprueba, tengo que realizar algunos cálculos (mediante una llamada Ajax). Si hay un error, tengo que romper el bucle y devolver un mensaje.

Cada llamada ajax tarda aproximadamente 0,4 segundos para realizar, pero que no puede ser un problema, ya que sólo puede tener un máximo de 4 de ellos verificado en cualquier momento dado.

Pero el problema que estoy enfrentando es que, al final de cuadro de alerta pops-up antes de la una dentro de la función de error (). La función de error hace el trabajo pero siempre aparece después de la final.

Yo tenía la impresión de que mediante la definición de la llamada como asíncrona = falso, la ejecución de código sería esperar hasta que la llamada devuelve una respuesta. Es que una suposición errónea?

¿Hay una manera de lograr esto?

Gracias de antemano

$("input[id*='chk_aut']").each(function() {
  if(this.value=="on") {
    $.ajax({
      type: "GET",
      url: "testpage.asp",
      cache:"false",
      async:"false",
      data: "which=checkvalues&value="
          + i_value
          + "&ref="+$("#cb_ref").val()
          + "&nif="+$("#txt_nif").val()
          + "&day="+i_day
          + "&month="+i_month
          + "&hours="+i_hours
          + "&year="+i_year + "&ms="
          + new Date().getTime(),
      success: function(msg) {
        //do something but continue the loop
      },
      error: function() {
        i_result =false;
        alert("An error has occurred");
        return false;//break the  loop
      }
    });
  }
});
alert(i_result);
¿Fue útil?

Solución

Creo que es necesario utilizar

,async: false

Así que se pasa el booleano false , no la cadena "falso" . Eso debería hacer que su síncrona llamada AJAX.

esta pregunta para una situación similar y algunos detalles más. En particular, es posible que para AJAX sincrónica llama no se puede utilizar el controlador de éxito y debe devolver los resultados una vez que su llamada ha completado (que está fuera del alcance de la AJAX llamar a sí mismo).

Si es posible se debe tratar de reestructurar su código para que pueda trabajar de forma asíncrona. ejecución síncrona no se traduce bien en el navegador.

En su situación, si está utilizando cada llamada AJAX para acumular resultados de cada casilla de verificación que se comprueba, considere almacenar el valor de trabajo en una variable de ventana y hacer el seguimiento de los cuales han regresado solicitudes. Cuando se determina que ha recibido una respuesta satisfactoria de vuelta para cada una de las llamadas AJAX que usted haya iniciado, puede dar comienzo a su cuadro de alerta o cualquier otra cosa que usted quiere hacer con los resultados. Esto es sólo un ejemplo de cómo se puede empezar a pensar de forma asíncrona.

Otros consejos

Como se mencionó en los href="http://docs.jquery.com/Ajax/jQuery.ajax#options" manual de , la función error es ...

  

Una función que se llamará si la petición falla.

Es decir, si hay un problema de comunicación entre el cliente y el servidor (por ejemplo: tiempo de espera, sin autorización, etc.). No se llama cuando el script del lado del servidor devuelve un valor que en su aplicación se considera un error. Mover ese código en success, y comprobar los datos de respuesta para ver cómo su guión trata cada solicitud.

Además, debo mencionar que tendría que tener realmente buenas razones para utilizar las llamadas síncronas. Sí, en su prueba sólo se tarda 1,5 segundos, pero lo que sucede cuando alguien tiene una conexión lenta, o el servidor está bajo carga pesada o no está disponible? peticiones síncronas congelar el navegador del cliente (es decir, ni siquiera cosas como el cambio de pestañas o el desplazamiento obras) y para hacer una muy mala experiencia del usuario. Si desea bloquear la interfaz de usuario en su página, hay un montón de maneras más amigables para hacerlo. Por ejemplo, visita BlockUI .

Es mucho mejor utilizar devoluciones de llamada y empezar a pensar de forma asíncrona, en lugar de vista del procedimiento. Es un poco de una lucha cuando se inicia por primera vez (ya que su código no se ejecuta necesariamente en línea por línea de la orden), pero es muy potente y flexible, una vez que el cuelgue de ella.

Uso async:false en lugar de async:"false" y disfrutar.

No estoy familiarizado con la opción async en la llamada ajax. He estado usando el Administrador de jQuery Ajax con éxito para situaciones en las que necesito llamadas ajax síncronos: http: // plugins.jquery.com/project/AjaxManager

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top