正在等待javascript异步回调@http帖子

时间:2009-08-04 15:11:27

标签: javascript asynchronous callback http-post

我正在实施一个小功能并且卡住了。

我有一个按钮来执行某些操作,例如

<input type="submit" value="My Button" onclick="javascript:DoSomething();" />

当用户点击按钮时,会调用DoSomething函数。

    function DoSomething()
    {
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
            }
          });
}

在函数内部定义了一个回调函数,该函数执行异步操作,在表单字段中写入城市名称。问题是异步回调将在页面发布后尝试在字段中写入。有没有我可以让后期处理等待回调结果?回调是在Google Maps API中定义的,我无法避免。

提前致谢

2 个答案:

答案 0 :(得分:1)

首先,您要修改onclick处理程序代码以包含类似的返回语句:

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />

然后修改DoSomething函数以返回false,以便在它处理异步回调时取消sumit。并修改异步回调以在完成后发布表单。

function DoSomething(doPost)
{
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;

                // resubmit the form here 
                $('#yourFormID').submit();
            }
          });

         return false; // cancel the submitting of the form
}

另一种方法是在表单上包含 onSubmit处理程序 ,并使用全局标志来确定是否允许提交表单(即,是否存在没有异步回调仍然在飞行中)。当异步回调返回时,您将清除该标志并重新提交javascript,如上所示,在 表单上调用 submit()方法 元件

答案 1 :(得分:0)

使用常规按钮(type =“button”)代替提交按钮,以便不发布表单。改为从回调函数发布表单。