jQuery延迟与谷歌地理编码错误

时间:2013-02-28 13:20:12

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

首先,我想说抱歉因为 我知道这么多类似的问题。 我读了很多,但我找不到答案);

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

我想在javascript中使用一种'wait'或'sleep'函数来等待异步geocode()函数完成,

但谷歌搜索了一段时间后,现在我明白了javascript没有任何一个,而且 我应该使用jQuery延迟这样做。

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

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

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. '待定'(提示1) - > 2.点的地址(回调中的警报) - > 3.'[object Object]'(警报2) - > 4.'已解决'(警报3) 因为我的代码将等待延迟直到解决,
  2. 但我所看到的是    1.'待定'(警报1) - > 2.'null'(警报2) - > 3.'待定'(警报3) - >地址(回调警报)

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

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

    这个问题阻止了我一个星期......

    提前致谢!

1 个答案:

答案 0 :(得分:2)

您似乎并不完全了解如何使用deferrds。

查看promise的{​​{3}}。使用deferrds,您永远不会返回实际值,而是使用deferrd返回它。

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

所以可以做这样的事情来访问这个点(用geocode()的任何回报替换promise()

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