我习惯于进行AJAX调用,但由于这些调用是异步执行的,因此在我的代码中,我不确定该调用是否已经完成。所以在下面的代码示例中,当我调用alert(url)时,可能还没有填充lat和lng变量。
因此,我希望代码在继续之前等待结果,而不是进行AJAX调用,因此需要同步请求。
我该怎么办?
var url='';
if ($('select[name="countryselect"]').val() != '0') { url += '&country=' + $('#countryselect option:selected').text(); }
if ($('#<%=tbCity.ClientID%>').val() != '') {
url += '&distance=' + $('#<%=ddlDistance.ClientID%>').val();
$.ajax({
type: "GET",
url: "/service.svc/getlocs/?cid=" + countryid
+ "&c=" + $('#<%=tbCity.ClientID%>').val(),
data: "",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
url += '&lat=' + msg[0].value;
url += '&lng=' + msg[1].value;
}
});
}
alert(url);
答案 0 :(得分:2)
您仍然可以使用ajax,但将需要发生的所有内容移入成功处理程序:
$.ajax({
type: "GET",
url: "/service.svc/getlocs/?cid=" + countryid
+ "&c=" + $('#<%=tbCity.ClientID%>').val(),
data: "",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
url += '&lat=' + msg[0].value;
url += '&lng=' + msg[1].value;
alert(url);
// more work here
}
});
答案 1 :(得分:1)
所以在下面的代码示例中,当我调用alert(url)时,可能还没有填充lat和lng变量。
它肯定没有被填写。请求是异步完成的,它当时还没有开始。它需要等待它的“转向”。
您应该做的是在Ajax请求的“成功”回调中将请求之后需要运行的所有代码放入。
因此,我希望代码在继续之前等待结果,而不是进行AJAX调用,因此需要同步请求。
我不知道现在的浏览器是否可以进行同步请求,但即使它们是一个糟糕的主意,因为它不仅仅是你的代码等待,而是整个页面执行会冻结。没有定时器更新,用户无法在其他地方点击等。
你需要学会使用回调。