Deferred and Ajax Deferred and Ajax ajax ajax

Deferred and Ajax


You'll need to wait for all requests to finish before alerting.

$.ajax({  url:'activeIDs',  success : function(data){ // data = [14,15]    var tableRows = [];    var requests = [];    for (var dataIndex=0; dataIndex < data.length; dataIndex++) {      var isLast = dataIndex == data.length;      var request = $.ajax({        url: 'info?id=' + data[dataIndex]      }).done(function(data2) { // "foo", "bar"        tableRows.push(data2.name);      });      requests.push(request);    }    // wait for all requests to finish here    $.when(requests).then(function(){      // all success functions have been called and updated things appropriately      alert(tableRows.length);    }  }});

This assumes that all requests succeed. It also looks like there are a few typos

  • Where does tableRows get updated?
  • Where is entries defined?

EditNow using promise style success handler. Should push the result in to tableRows before calling the $.when().then callback


Why do you want $.Deferred ? Your $.ajax calls are returning a promise, so, you can use it:

var promisesArray = [];for (var dataIndex=0; dataIndex < data.length; dataIndex++) {  promisesArray.push($.ajax({...}));} $.when.apply($, promisesArray).then(...);

(inspired by this answer)

You can use deferreds by taking this solution and passing it to a deferred if you want, but it's not neccesary:

var x = $.Deferred(function(defer){      var promisesArray = [];    for (var dataIndex=0; dataIndex < data.length; dataIndex++) {      promisesArray.push($.ajax({...}));    }     $.when.apply($, promisesArray).done(function(data) { defer.resolve(data); });});return x.promise();

(Not tested, I'm sorry)