-1

案例: 我有一个通过以下方式提交的网络表单:

 $('#myForm').on('valid', function (e) { ... }

在该函数中,我从一个代码部分开始,以从地址获取地理位置。

var geocoder = new google.maps.Geocoder();
var address = $('#address').val();
geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        $('#latlng').val(results[0].geometry.location);
    }
});

看到我在隐藏的输入字段中添加了地理位置。

在那部分之后,我打电话$.ajax({ ... })发送数据。

问题: ajax 调用在隐藏字段填充地理位置之前发送数据(那个仍在运行;成功)。

问题 如何确保$.ajax调用在代码部分结束之前被激活?

我需要$.ajax使用特定设置进行配置吗?有等待的解决方案吗?

谢谢!

是的,我查看了其他答案,但回调(已提到)无法正常工作。

4

3 回答 3

2

您需要将 ajax 调用放在回调中。

像这样的东西:

geocoder.geocode( { 'address': address}, function(results, status) {

    //this function is the callback
    //it will run when geocode completes
    if (status == google.maps.GeocoderStatus.OK) {
        $('#latlng').val(results[0].geometry.location);
    }

    //ajax here
    $.ajax(....)

});

//code down here will run before the callback executes

geocode 的第二个参数是一个函数,它在 geocode 操作完成时运行,并且在所有当前代码都已执行之后运行。因此,如果您将 ajax 调用直接放在地理编码调用之后,它将始终在地理编码回调执行之前运行。

如果您希望代码在回调中发生的事情之后执行,则必须从回调内部调用它们,或者让它们等待消息或事件。您可以在回调完成时触发这样的事件,或者(效率较低)定期触发。

不过要理解的关键是回调是异步的,直到(最早)当前上下文中的所有代码都执行后才会运行。

于 2013-08-21T14:02:01.417 回答
0

您的 ajax 调用应该在geocode回调中

geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        $('#latlng').val(results[0].geometry.location);
        //Ajax call here.
        $.ajax({});
    }
});
于 2013-08-21T14:02:13.607 回答
-3

使用 JavaScript setTimeout() 函数并在您要完成的操作之后调用 setTimeout() First > Easy Peazy > 是的,Sabu 会这样编码。

于 2013-08-21T14:05:12.820 回答