在完成另一个完成后执行更多JS

时间:2013-08-21 13:58:47

标签: javascript jquery callback

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

 $('#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?有等待的解决方案吗?

谢谢!

是的,我查看了其他答案,但无法回复(已提及)。

3 个答案:

答案 0 :(得分: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

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

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

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

答案 1 :(得分: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({});
    }
});

答案 2 :(得分:-3)

使用JavaScript setTimeout()函数并调用setTimeout()在您要完成的操作之后首先> Easy Peazy>是的萨布会用这种方式编码。