我正在尝试使用 Javascript Geolocation API 来获取用户的经度和纬度。我希望能够通过调用 getCoords() 函数来获取该信息,但遇到了问题。此代码:
function getCoords() {
var coords = 5;
var deferred = $.Deferred();
getPosition = function() {
navigator.geolocation.getCurrentPosition(
function(position){
deferred.resolve({
longitude: position.coords.longitude,
latitude: position.coords.latitude,
});
}, function(error) {
deferred.reject();
});
return deferred.promise();
}
$.when(getPosition())
.done( function(data) {
coords = data;
console.log(coords); // Statement A
});
console.log(coords) //Statement B
return coords;
}
console.log(getCoords().toString()); //Statement C
将以下内容输出到控制台
5 //Statement B
5 //Statement C
Object {longitude: 41.40338, latitude: 2.17403} //Statement A
这是有道理的,因为地理定位 API 是异步的。如果我将代码的后半部分更改为:
$.when(getPosition())
.done( function(data) {
coords = data;
return coords;
});
}
我收到以下错误消息:
Uncaught TypeError: Cannot call method 'toString' of undefined
(anonymous function)
我在网上找到的所有其他示例都有 $.when 部分代码输出到 alert
而不是return
方法。有人对如何使 getCoords() 返回正确的对象有任何想法吗?谢谢!
最佳答案
您仍然会遇到尝试使用延迟解决的相同问题。您刚刚将返回延迟的函数包装在另一个尝试同步返回异步结果的函数中。 getCoords
必须返回一个 deferred,并且调用者必须了解并处理 Promise 对象。
我会这样写:
function getCoords() {
var coords = 5;
var deferred = $.Deferred();
navigator.geolocation.getCurrentPosition(function (position) {
deferred.resolve({
longitude: position.coords.longitude,
latitude: position.coords.latitude,
});
}, function (error) {
deferred.reject();
});
return deferred.promise();
}
//elsewhere
getCoords().done(function (data) {
console.log(data);
}).fail(function () {
console.log('failed');
});
关于javascript - 异步地理定位 API 和 jQuery 延迟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18239712/