How to know when all ajax calls are complete

JqueryAjax

Jquery Problem Overview


I have a table style page with rows. Each row has a checkbox. I can select all/many checkboxes and click "submit" and what is does is a Jquery ajax call for each row.

Basically I have a form for each row and I iterate over all the checked rows and submit that form which does the jquery ajax call.

So I have a button that does:

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

Then each row has:

	 		<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>

This form submits to 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");
		  }
		});
   }

What I wanted to know is, from this is there a way I can tell if all my Ajax calls are complete. Reason being that want to enable/disable the submit button while all these calls are taking place.

Thanks and please note that I had to mangle my variable names due to the sensitivity of the application, so many of them may be duplicated.

Jquery Solutions


Solution 1 - Jquery

The easy way

The easiest way is to use the .ajaxStop() event handler:

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

The hard way

You can also manually detect if any ajax call is still active:

Create a variable containing number of active Ajax connections:

var activeAjaxConnections = 0;

just before opening new Ajax connection increment that variable

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

in success part check if that variable equals to zero (if so, the last connection has finished)

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
  }
}

As you can see, I've added also checking for return with error

Solution 2 - Jquery

A neat solution would be to use;

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

For more information check out the jQuery .ajaxStop function at http://api.jquery.com/ajaxStop/

Solution 3 - Jquery

Solution 4 - Jquery

How about just simply use if?

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

          }
   }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrian GView Question on Stackoverflow
Solution 1 - JqueryTomasz TybulewiczView Answer on Stackoverflow
Solution 2 - JqueryOrsonView Answer on Stackoverflow
Solution 3 - Jquerynothing-special-hereView Answer on Stackoverflow
Solution 4 - JqueryJaroslavView Answer on Stackoverflow