【问题标题】:jQuery deferred works wrong with google geocodejQuery deferred 与谷歌地理编码错误
【发布时间】:2013-02-28 13:20:12
【问题描述】:

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

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

我想在 javascript 中使用一种“等待”或“睡眠”函数来等待异步 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' (alert 1) -> 2. 点的地址(alert in callback) -> 3. '[object Object]'(警报 2)-> 4. 'resolved'(警报 3) 因为我的代码会延迟等待,直到解决,

但我看到的是 1. 'pending' (alert 1) -> 2. 'null' (alert 2) -> 3. 'pending' (alert 3) -> 一个地址(alert in callback)

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

我试过用 done() 和 always() 代替 then(),但都失败了。

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

    看看example from the docpromises。使用 deferrd,您永远不会返回实际值,而是使用 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");
    });
    

    【讨论】:

    • 您的回答完美!我是多么愚蠢..非常感谢您的友好回答。
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多