Deferred and Ajax

后端 未结 3 886
生来不讨喜
生来不讨喜 2021-02-06 06:33

Reading a JSON-Service like this:

$.ajax({
  url:\'activeIDs\',
  success : function(data){ // data = [14,15]
    var tableRows = [];
    for (var dataIndex=0; d         


        
相关标签:
3条回答
  • 2021-02-06 06:56

    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

    0 讨论(0)
  • 2021-02-06 07:18

    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" );
      });
    
    0 讨论(0)
  • 2021-02-06 07:21

    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)

    0 讨论(0)
提交回复
热议问题