调用与jQuery同步的基于REST的服务

时间:2013-07-24 23:07:21

标签: jquery rest synchronous

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

2 个答案:

答案 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调用,因此需要同步请求。

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

你需要学会使用回调。