延迟和Ajax

Pet*_*der 8 ajax jquery jquery-deferred

像这样读JSON-Service:

$.ajax({
  url:'activeIDs',
  success : function(data){ // data = [14,15]
    var tableRows = [];
    for (var dataIndex=0; dataIndex < data.length; dataIndex++) {
      var isLast = dataIndex == (data.length - 1);
      $.ajax({
        url: 'info?id=' + data[dataIndex],
        success: function(data2) { // "foo", "bar"
          tableRows.push(data2.name);
          if (isLast) {
            alert(tableRows.length);
          }
        }
      });
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

第一个网络跟踪是:

  1. activeIDs = [14,15]
  2. info?id = 14(需要2秒)= "foo"
  3. info?id = 15(需要4秒)= "bar"

在这种情况下,警报给出"2".

秒网络跟踪是不同的:

  1. activeIDs = [14,15];
  2. info?id = 14(需要20秒)= "foo"(现在需要很长时间)
  3. info?id = 15(需要1秒)= "bar"

在这种情况下警报提供1一秒后,这是不好的!

题:

如何使用$ .Deferred代替isLast

phu*_*uzi 7

您需要等待所有请求在完成之前完成alert.

$.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);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

这假设所有请求都成功.它看起来也有一些拼写错误

  • 哪里tableRows更新?
  • 在哪里entries定义?

使用promise样式成功处理程序立即编辑.应该tableRows在调用$.when().then回调之前将结果推送到