2008-11-13 20 views
63

que tienen una página de estilo de tabla con filas. Cada fila tiene una casilla de verificación. Puedo seleccionar todas/muchas casillas de verificación y hacer clic en "enviar" y lo que hace es una llamada Jquery ajax para cada fila.¿Cómo saber cuando todas las llamadas ajax están completos

Básicamente tienen una forma para cada fila y yo iterar sobre todas las filas controladas y presentar esa forma que lo hace la llamada jQuery Ajax.

Así que tienen un botón que hace:

 $("input:checked").parent("form").submit(); 

A continuación, cada fila tiene:

  <form name="MyForm<%=i%>" action="javascript:processRow(<%=i%>)" method="post" style="margin:0px;"> 
       <input type="checkbox" name="X" value="XChecked"/> 
       <input type="hidden" id="XNumber<%=i%>" name="X<%=i%>" value="<%=XNumber%>"/> 
       <input type="hidden" id="XId<%=i%>" name="XId<%=i%>" value="<%=XNumber%>"/> 
       <input type="hidden" id="XAmt<%=i%>" name="XAmt<%=i%>" value="<%=XAmount%>"/> 
       <input type="hidden" name="X" value="rXChecked"/> 
      </form> 

Esta forma se somete a processRow:

function processRow(rowNum) 
    { 
     var Amount = $('#XAmt'+rowNum).val(); 
     var XId = $('#XId'+rowNum).val(); 
     var XNum = $('#OrderNumber'+rowNum).val(); 
     var queryString = "xAmt=" + "1.00" + "&xNumber=" + OrdNum + "&xId=" + xId; 


     $('#coda_'+rowNum).removeClass("loader"); 
     $('#coda_'+rowNum).addClass("loading"); 


     $.ajax({ 
      url: "x.asp", 
      cache: false, 
      type: "POST", 
      data: queryString, 
      success: function(html){ 
      $('#result_'+rowNum).empty().append(html); 
      $('#coda_'+rowNum).removeClass("loading"); 
      $('#coda_'+rowNum).addClass("loader"); 
      } 
     }); 
    } 

Lo que quería saber es , de esto hay una forma en que puedo decir si todas mis llamadas a Ajax están completas. La razón es que desea habilitar/deshabilitar el botón de enviar mientras se realizan todas estas llamadas.

Gracias y tenga en cuenta que tenía que destrozar mis nombres de variables debido a la sensibilidad de la aplicación, por lo que muchos de ellos pueden ser duplicado.

+1

Si bien detectar cuando se completan todas las llamadas ajax tiene valor para cualquier diseño, creo que una mejor solución general es enviar varias filas a la vez. Enviar cada fila como una publicación separada de Ajax va a ser * realmente * difícil en el sistema de alguna manera, y no es (en mi opinión) el mejor diseño. Incluso iré tan lejos como para decir que * prometo * que algún día, si te apegas a este diseño de una-ajax-llamada-por-fila, te arrepentirás. – ErikE

+0

Además del problema de diseño señalado por @ErikE, me sorprende que nadie haya mencionado el uso de Promises para responder la pregunta original. –

Respuesta

106

La manera fácil

La forma más sencilla es utilizar el .ajaxStop() event handler:

$(document).ajaxStop(function() { 
    // place code to be executed on completion of last outstanding ajax call here 
}); 

El camino difícil

También puede detectar de forma manual si alguna llamada AJAX está todavía activo:

Crear una variable que contiene el número de conexiones activas Ajax:

var activeAjaxConnections = 0; 

justo antes de la apertura de nuevo incremento conexión Ajax esa variable

$.ajax({ 
    beforeSend: function(xhr) { 
    activeAjaxConnections++; 
    }, 
    url (...) 

en success cheque parte si esa variable es igual a cero (si es así, la última conexión ha terminado)

success: function(html){ 
    activeAjaxConnections--; 
    $('#result_'+rowNum).empty().append(html); 
    $('#coda_'+rowNum).removeClass("loading"); 
    $('#coda_'+rowNum).addClass("loader"); 
    if (0 == activeAjaxConnections) { 
    // this was the last Ajax connection, do the thing 
    } 
}, 
error: function(xhr, errDesc, exception) { 
    activeAjaxConnections--; 
    if (0 == activeAjaxConnections) { 
    // this was the last Ajax connection, do the thing 
    } 
} 

Como se puede ver, he añadido también la comprobación de retorno con el error

+3

¿cómo se puede eliminar el controlador ajaxStop nuevamente después de que se haya activado? – rob

+0

http://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done –

+2

Con respecto a 'The Hard way': no ​​hay necesidad de mantener una variable, Jquery ya lo hace: $ .active mantiene el número actual de llamadas activas ajax – Sebastianb

21

Una buena solución sería usar;

$("body").ajaxStop(function() { 
    //Your code 
}); 

Para obtener más información, consulte el jQuery.ajaxStop función en http://api.jquery.com/ajaxStop/

-1

¿Qué hay de simplemente utilizar si?

success: function(html){ 
    if(html.success == true){ 
      $('#result_'+rowNum).empty().append(html); 
      $('#coda_'+rowNum).removeClass("loading"); 
      $('#coda_'+rowNum).addClass("loader"); 

      } 
    } 
Cuestiones relacionadas