异步地理定位API和jQuery延迟对象
Asynchronous Geolocation API and jQuery Deferred Objects
我正在尝试使用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()返回正确的对象吗?谢谢
您仍然会遇到您试图通过使用deferred解决的问题。您刚刚将返回延迟的函数封装在另一个试图同步返回异步结果的函数中。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');
});
相关文章:
- jQuery延迟了ajax调用的循环
- jQuery延迟怪异
- 使用jquery延迟对象链接多个ajax调用
- 将额外的参数传递给jquery.延迟回调
- jQuery addClass中断延迟,或者jQuery延迟中断CSS转换,或者两者兼而有之
- 使用jQuery延迟表单输入,并在延迟后在同一页面上显示结果
- jQuery 延迟的 AJAX 调用返回值
- 使jquery延迟加载插件在视口内工作
- jQuery 延迟使用一系列函数
- jQuery延迟了链接保存,统一结果
- Jquery延迟未按预期运行
- Jquery延迟脚本的执行
- 鼠标输入事件上的jQuery延迟出现问题
- 如何停止基于jQuery延迟定时器的动画
- jQuery延迟音量In
- jQuery延迟/暂停动画
- Javascript (Mobile) - 使用 jquery 延迟加载图像
- jQuery 延迟不算作动画
- 使用 jQuery 延迟对象管理 ajax 调用
- 每个循环的 JQuery 延迟对后置请求不起作用