首先,我想说抱歉因为 我知道这么多类似的问题。 我读了很多,但我找不到答案);
我正在使用谷歌地图构建一个网络应用程序。
我想在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.'null'(警报2) - > 3.'待定'(警报3) - >地址(回调警报)
为什么不等到解决或拒绝?
我用done()和always()而不是then()尝试过,但都失败了。
这个问题阻止了我一个星期......
提前致谢!
答案 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");
});