jQuery 延迟与谷歌地理编码一起工作时出错

标签 jquery google-maps-api-3 jquery-deferred

首先,我想说声抱歉,因为 我知道很多类似的问题。 我读过很多,但我无法得到答案);

我正在使用谷歌地图构建一个网络应用程序。

我想在 JavaScript 中使用一种“等待”或“ sleep ”函数来等待异步 geocode() 函数完成,

但经过谷歌搜索一段时间后,现在我明白 javascript 没有它们,并且 我应该使用 jQuery deferred 来做到这一点。

(我正在使用 jQuery 1.8.3,并使用 google chrome 浏览器进行测试)

所以我像这样编写了我的代码,但它不起作用。

Location.prototype.geocode = function() {
    deferred = new $.Deferred();
    var latLng = this.latLng;
    var point = null;

    geocoder.geocode( {'latLng': latLng},
        function(results, status) {
            var point = null;
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    alert(results[0].formatted_address); // alert in callback
                    point = get_something_blah_blah_function() /* set return value here */
                    deferred.resolve();
                } else {
                    deferred.reject();
                    alert('Geocder Error: no result');
                }
            } else {
                deferred.reject();
                alert('Geocoder Error: ' + status);
            }
        }

    );

    alert(deferred.state()); // alert 1
    deferred.then(alert(point)); // alert 2
    alert(deferred.state()); // alert 3

    return point; /* return value is set in geocode callback function */
}

我预计我会按此顺序看到警报消息,

  1. 'pending' (警报 1) -> 2. 该点的地址(回调中的警报) -> 3.“[object Object]”(警报 2)-> 4.“已解决”(警报 3) 因为我的代码将延迟等待直到解决,

但我看到的是 1.“待处理”(警报 1)-> 2.“空”(警报 2)-> 3.“待处理”(警报 3)-> 地址(回调中的警报)

为什么不等到解决或拒绝?

我尝试过使用done()和always()而不是then(),但都失败了。

这个问题困扰了我一周...

提前致谢!

最佳答案

看来您并不完全了解如何使用 deferrds。

看看 example from the doc对于 promise 。使用 deferrds,您永远不会返回实际值,而是使用 deferrd 来返回它。

因此,您需要返回一个 deferred.promise(),而不是返回 point。然后你可以使用$.when()当 deferrd 成功或失败时执行回调。为了访问成功或失败的值,您需要将所需的参数传递给适当的函数。您解决或拒绝延迟,现在使用值 deferred.resolve(point) 来执行此操作.

因此可以执行类似的操作来访问该点(将 geocode() 替换为返回 promise() 的内容)

$.when(geocode()).then(function(point){
  console.log(point);
}, function() {
  console.log("the deferred got rejected");
});

关于jQuery 延迟与谷歌地理编码一起工作时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15136614/

相关文章:

c# - 添加 toastr javascript asp.net webform

javascript - 点击链接时谷歌地图平移到中心

jquery - 使用 jQuery 中的自定义方法返回 promise

jquery - jquery延迟调用的这些模式有什么区别?

jquery - 如何从 jQuery 中的链式延迟返回值?

jquery - CSS-HTML : dynamically display table rows inline and break new row

javascript - HTML 日期选择器 - 默认打开

javascript - 如何仅在单击表头时在表头上应用样式并在单击任何其他表头时删除样式?

google-maps - 在谷歌地图全屏中时 select2 不起作用

google-maps - 从 Google map API 响应渲染 Google map