我在一些getJSON上有一个脚本,请帮助解决。
$.getJSON('data1_get.php', {dbase: 'file1', param: '0'}, function(data_1) {
$.getJSON('data2_get.php', {dbase: 'file2', param: '1'}, function(data_2) {
for (var i=0; i<data_1.length; i++) { // about 4 rows
for (var k=0; k<data_2.length; k++) { // about 7 rows
if (data_1[i].type == data_2[k].type) {
if (data_2[k].switch=="1") { // possible many process
// check.php needed time about 3 seconds for 1 process
$.getJSON('check.php', {param: data_2[k].turnOn}, function(data_3) {
// not work
if (data.status) {
alert('working for '+data_2[k].title);\n";
}
});
}
}
}
}
});
});
我的问题是:如果我们从ajax请求中获得所有回调,我怎么能强迫它等待而不是继续?
谢谢!
答案 0 :(得分:0)
如果我理解正确,您希望在收到每个项目的响应后执行回调。在回调中,我会在收到每个响应后递增计数器,并检查计数器是否与项目总数相同。如果是,请调用最终回调。 JavaScript是单线程的,因此没有并发问题。
答案 1 :(得分:0)
您可以使用$.ajax
和async: false
,例如,这里:
但是,请查看文档:
其中(对于async
参数)它如预期所示:
请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
也就是说,如果您按照自己的意愿行事,则可能会阻止浏览器,直到所有请求完成。由于您似乎暗示有很多事情发生,这可能会禁止用户在您的页面上做很长时间的任何事情。用户体验不是一件好事......
异步调用是一个更好的选择 - 它们不会阻止浏览器用户界面,但你必须自己管理循环展开,不幸的是这是响应的代价......你需要做些什么才能实现这一点首先为你想要进行的所有调用创建一个参数列表,然后逐个异步调用它们,在回调函数中进行另一次调用。看看这个插件你可以用它:
答案 2 :(得分:0)
基本上,你会想要利用回调。
在jQuery中,它可能是这样的:
$.ajax("/someresource", {
success: function() {
$.ajax("/somethingelse", {
success: function() {
alert("This happens after the request completes with a 200!");
}
});
}
});
有关详细信息,请参阅jQuery Ajax docs。请记住,get
,post
和getJSON
等函数将遵循此函数,因此它们的行为类似。
答案 3 :(得分:0)
另请查看jQuery.deferred()
,因为这可能对您有帮助。