具有多个相互依赖的getJSON调用的延迟对象

时间:2017-08-21 16:43:08

标签: javascript jquery

我在myFunction()进行3次JSON调用,点击按钮即可调用。其中2个getJSON依赖于彼此的执行。它基本上解析了10个网页并收集了一些数据。使用此数据,它将转到另一个页面并收集一些其他数据。我想在myFunction的末尾显示“DONE”,以便用户知道我们最终获得了所有数据并且搜索操作已完成。但是,我认为这些调用是异步的,所以我使用了延迟对象。但即使我将所有呼叫都传递给$.when.apply(call1,call2,call3),它也会在控制台上打印任何数据之前显示“完成”。一旦打印“完成”,它就会开始打印结果。如何修改我的代码,以便只有当myFunction完全针对所有10个页面运行并且在控制台上打印了所有数据时,我才能显示“DONE”。

var call1 = [];
var call2 = [];
var call3 = [];

function myFunction() {
  data3 = [];
  url = ''; // some URL here
  call3.push($.getJSON(url, function(data4) {
    data3 = data4;
  }));
  for (var page = 1; page < 10; page++) {
    (function(page) {
        url = 'http://example.com/' + page;
        call1.push($.getJSON(url, function(data1) {
            for (var num = 0; num < data1.standings.results.length; num++) {
              (function(num) {
                  url = 'http://example.com/' + data1.entry[num];
                  call2.push($.getJSON(url, function(data2) {
                      for (var i = 0; i < 15; i++) {
                        (function(i) {
                            console.log(data3.ele[(data2.p[i].element) - 1].x);
                            return;
                          }
                        })(i);
                    }
                  })
                );
              })(num);
          }
        })
      );
    })(page);
};
$.when.apply(call1, call2, call3).then(function() {
  console.log("DONE");
});
}

1 个答案:

答案 0 :(得分:0)

我终于能够解决这个问题了。正如评论中所提到的,我们需要链接各种promises,并且函数结构应该与when命令的结构相匹配。因此,在首先推送call1的函数中,我需要为call1调用when命令,然后嵌套后续命令,依此类推。

var call1 = [];
var call2 = [];
var call3 = [];

function myFunction() {
  data3 = [];
  url = ''; // some URL here
  call3.push($.getJSON(url, function(data4) {
    data3 = data4;
  }));
  for (var page = 1; page < 10; page++) {
    (function(page) {
        url = 'http://example.com/' + page;
        call1.push($.getJSON(url, function(data1) {
            for (var num = 0; num < data1.standings.results.length; num++) {
              (function(num) {
                  url = 'http://example.com/' + data1.entry[num];
                  call2.push($.getJSON(url, function(data2) {
                      for (var i = 0; i < 15; i++) {
                        (function(i) {
                            console.log(data3.ele[(data2.p[i].element) - 1].x);
                            return;
                          }
                        })(i);
                    }
                  })
                );
              })(num);
          }
        })
      );
    })(page);
};
$.when.apply($, call1).then(function(){
$.when.apply($, call2).then(function(){
document.getElementsByName('output')[0].value+="Search Completed"+'\r\n';
});
});
}