我在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");
});
}
答案 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';
});
});
}