我有三个"来源,"每个都需要进行ajax调用。但是,因为Ajax是异步的,所以我不能把它放在for循环中。与此同时,我无法async: false
,因为浏览器挂起是不好的。
因此,我决定在其success
回调中多次调用Ajax,并构造一种人工循环。问题是,它无法正常工作(我将在稍后的问题中解释错误)。这是我的相关代码。
counter: 0,
load: function(source, start_month, end_month, start_year, end_year) {
start_month = parseInt(start_month) + 1;
end_month = parseInt(end_month) + 1;
var parseDate = d3.time.format("%Y-%m-%d").parse;
if(source == 0) {
$.ajax({
dataType: "json",
url: ...
data: {
...
},
crossDomain: true,
success: function(raw_data) {
posts.counter++;
if(posts.counter < 4) {
alert(posts.counter);
posts.load(source, start_month, end_month, start_year, end_year);
} else {
alert("plot graph");
}
}
});
}
...
整个代码块存在于posts
闭包内。只是几个问题:
这是好风格吗?有没有更有效的方法来做这件事?
出于某种原因alert
只发射了两次......不应该这样
用1,2和3射击3次?
答案 0 :(得分:1)
我建议使用JS promises(又名deferred对象)。查看jQuery的when和then函数(http://api.jquery.com/jquery.when/和http://api.jquery.com/deferred.then/)。您可以使用延迟对象进行3次异步调用,并等待处理数据,直到所有3次调用都返回。