javascript - 异步地理定位 API 和 jQuery 延迟对象

标签 javascript jquery geolocation anonymous-function jquery-deferred

我正在尝试使用 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/

相关文章:

javascript - 如何在AS3中以均等的机会生成真正的随机数?

javascript - 调用Stripe.card.createToken()会导致哪些错误子集?

javascript - 将我重定向到另一个 HTML 页面的可点击 div

html - Google Maps Javascript GeoLocation - 不适用于 Chrome

ios - 仅在检测到特定 Wifi 网络时才允许签到

javascript - 使用 useState Hook 时 - 更改 setState 函数调用顺序是否重要?

javascript - "Simon Says"计算机随机选择显示不正确

javascript - (jQuery) 使用 extend() 访问自定义属性时出现问题

jquery - 淡入 jquery 加载调用

R将邮政编码或纬度/经度转换为县