异步地理定位 API 和 jQuery 延迟对象 [重复]

Posted

技术标签:

【中文标题】异步地理定位 API 和 jQuery 延迟对象 [重复]【英文标题】:Asynchronous Geolocation API and jQuery Deferred Objects [duplicate] 【发布时间】:2013-08-14 18:40:37 【问题描述】:

我正在尝试使用 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() 返回正确的对象有任何想法吗?谢谢!

【问题讨论】:

你在哪里返回它,这并不重要,因为你不能以这种方式从异步操作返回值。您将其返回到的功能可能已经完成了它所做的一切? 是的,这种逻辑是行不通的。如果getCords 正在发出ajax 请求,你就不能做var coords = getCords() 【参考方案1】:

您仍然会遇到您尝试通过使用 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');
);

【讨论】:

以上是关于异步地理定位 API 和 jQuery 延迟对象 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript/jQuery:在 CodePen 中设置 IP 地理定位 API

jQuery源码 02--(3043 , 3183) Deferred : 延迟对象 : 对异步的统一管理

与内部的另一个异步 api 调用反应 Native GeoLocation 不起作用

jquery的2.0.3版本源码系列:3043行-3183行,deferred延迟对象,对异步的统一管理

JS新API标准 地理定位(navigator.geolocation)

JS新API标准 地理定位(navigator.geolocation)/////////zzzzzzzzzzz