【问题标题】:Google Geocoder Asynchronous Issue谷歌地理编码器异步问题
【发布时间】:2011-05-25 19:25:16
【问题描述】:

我认为地理编码器结果存在时间问题。请参阅下面的代码 sn-p。

我基本上是在执行地理编码并获得结果。然后我通过 jQuery AJAX 调用将结果传递给服务器端方法。最后,该方法的结果返回一个 JSON 对象。根据结果​​,我可能会也可能不会执行第二次地理编码。这就是问题所在。

您可以看到我有一个变量 hasResult 默认为 false,并在确定有效结果后切换为 true。在所有情况下,这都是完美的,除非需要进行第二次地理编码。地理编码成功发生并且代码执行,但最终的hasResult 检查仍然返回 false。这怎么可能?

var hasResult = false;            
geocoder.geocode({ "address": address }, function (results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        $.ajax({
            url: "URL",
            type: "POST",
            dataType: "json",
            data: results
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                        if (result.Valid) {
                            hasResult = false;
                            //Some other code, works perfect                            
                        } else {
                            geocoder.geocode({ "address": result.ValidRequest }, function (resultsNew, statusNew) {
                                if (statusNew == google.maps.GeocoderStatus.OK) {
                                    hasResult = false; 
                                    //Some other code, works perfect
                                }
                            });
                        }
                    });
                });
            }
        });
    }
});

if (hasResult == true) {
    alert('Success');
} else {
    alert('Fail');
}

谢谢

【问题讨论】:

    标签: jquery asynchronous google-geocoder


    【解决方案1】:

    这是因为您在从服务器获取结果之前检查了hasResult 的值。发生这种情况是因为请求是异步的。您应该改用回调。

    编辑:

    试试这个(这只是一个模型,未经测试,更改它以提高可读性,将successOrFailure 作为参数/回调等传递):

    var hasResult = false;            
    
    var successOrFailure = function(hasResult){
        if (hasResult == true) {
            alert('Success');
        } else {
            alert('Fail');
        }
    };
    
    geocoder.geocode({ "address": address }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            $.ajax({
                url: "URL",
                type: "POST",
                dataType: "json",
                data: results
                contentType: "application/json; charset=utf-8",
                success: function (result) {
                            if (result.Valid) {
                                hasResult = false;
                                successOrFailure(hasResult);
                                //Some other code, works perfect                            
                            } else {
                                geocoder.geocode({ "address": result.ValidRequest }, function (resultsNew, statusNew) {
                                    if (statusNew == google.maps.GeocoderStatus.OK) {
                                        hasResult = false;
                                        successOrFailure(hasResult); 
                                        //Some other code, works perfect
                                    }
                                });
                            }
                        });
                    });
                }
            });
        }
    });
    

    【讨论】:

    • 所以你说的是地理编码器被调用,但脚本继续到条件语句,其余的将完成。有道理,你能提供一个你提议的模型吗?
    • @Dusting 我添加了一些原始示例来向您展示如何制作它。 '回调'函数(实际上是successOrFailure函数)在你知道你是失败还是成功之后执行。使其适应您的需求。它对你有用吗?
    • 太棒了 :) 很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多