首先,我想说声抱歉,因为 我知道很多类似的问题。 我读过很多,但我无法得到答案);
我正在使用谷歌地图构建一个网络应用程序。
我想在 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 */
}
我预计我会按此顺序看到警报消息,
- '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/