2

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

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

我想在 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]' (alert 2) -> 4. 'resolved' (alert 3) 因为我的代码会等待解决,直到解决,

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

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

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

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

提前致谢!

4

1 回答 1

2

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

看看s文档中的示例promise。使用 deferrd,您永远不会返回实际值,而是使用 deferrd 来返回它。

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

所以可以做这样的事情来访问该点(替换geocode()为返回的任何内容promise()

$.when(geocode()).then(function(point){
  console.log(point);
}, function() {
  console.log("the deferred got rejected");
});
于 2013-02-28T13:29:20.310 回答