首先,我想说声抱歉,因为我知道很多类似的问题。我读过很多,但我无法得到答案);
我正在用谷歌地图构建一个网络应用程序。
我想在 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 */
}
我预计我会按此顺序看到警报消息,
- '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() 尝试过,但都失败了。
这个问题阻止了我一个星期......
提前致谢!