Deferred and Ajax

为君一笑 提交于 2019-12-03 07:55:50

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?

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

Tistkle

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)

Use jQuery when

// Function to return id info based on this example http://stackoverflow.com/questions/5316697/jquery-return-data-after-ajax-call-success 
function getInfo(ID) {
return $.get("info?id=" + ID);  
}
// based on examples from https://api.jquery.com/jQuery.when/
var promises = [];
var jqxhr = $.get("activeIDs")
  .done(function(data) {
    $.each(data,function(i,v) {
        promises.push(getInfo(v));
    });
    $.when(promises).done(function(p) {
        console.log(p,p.length);
    });
  })
  .fail(function() {
    alert( "Error" );
  });
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!