1

我习惯于进行 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);
4

2 回答 2

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
             }
         });
于 2013-07-24T23:11:54.960 回答
1

所以在下面的代码示例中,当我调用 alert(url) 时,可能是 lat 和 lng 变量尚未填充。

肯定不会填的。请求是异步完成的,那个时候还没有开始。它需要等待它的“轮到”。

您应该做的是将所有需要在请求之后运行的代码放在 Ajax 请求的“成功”回调中。

因此,我希望我的代码在继续之前等待结果,而不是进行 AJAX 调用,因此是一个同步请求。

我不知道在现代浏览器上是否甚至可以进行同步请求,但即使它们是一个糟糕的主意,因为它不仅是您的代码在等待,而且整个页面的执行都会冻结。没有计时器更新,用户不能点击其他任何地方,等等。

您需要学习使用回调。

于 2013-07-24T23:11:09.720 回答