首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GeoFire geoQuery返回数据

GeoFire geoQuery返回数据
EN

Stack Overflow用户
提问于 2015-07-19 09:53:07
回答 1查看 2.2K关注 0票数 0

我是Firebase + GeoFire的新手,geoFire查询函数有问题。

我希望将geoQuery函数的结果添加到数组中,并将其返回到函数中。但是我在geoQuery.on方法中操作的数据似乎超出了范围,或者无法获得,或者由于承诺,我不知道。事实上,在geoquery.on方法之外,变量卖家是空的。

如何返回geoQuery的结果并将其保存到返回变量中

代码语言:javascript
复制
//Set seller position in firebase db
var setPosition = function() {
    navigator.geolocation.getCurrentPosition(setPositionSuccess, error, options);
    //navigator.geolocation.watchPosition(setPositionSuccess, positionError, { enableHighAccuracy:true })
};  

//Get sellers near buyer position
var getSellersForCurrentPosition = function() {
    navigator.geolocation.getCurrentPosition(getPositionSuccess, error, options);
    //navigator.geolocation.watchPosition(positionSuccess, positionError, { enableHighAccuracy:true })
};  


//Callback function from html 5 geo api
function getPositionSuccess(pos) {

    var crd = pos.coords;
    var currentPosition = [crd.latitude, crd.longitude];

    // Query radius
    var radiusInKm = 2;

    var firebaseRef = new Firebase(FBURL + "/geofire/sellers/");
    var geoFire = new GeoFire(firebaseRef);

    var geoQuery = geoFire.query({
        center: currentPosition,
        radius: radiusInKm
    }); 

    var sellers = []; 
    var oneSeller = {}; 

    var onKeyEnteredRegistration = geoQuery.on("key_entered", function(key, location, distance) {
        oneSeller = { 
            id: key,
            distance: distance,
            location: location
        };  
        sellers.push(oneSeller);
    }); 

    var onReadyRegistration = geoQuery.on("ready", function() {
          geoQuery.cancel();
    });

    return sellers;

} 

顺便问一下,html5的地理定位有多精确?桌面浏览器和移动浏览器有区别吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-19 15:49:20

Geofire 监控卖家在你所指的范围内。每当卖方进入/退出范围时,它都会触发一个key_enteredkey_exited事件。这些事件可以在启动查询后的任何时候发生。用JavaScript术语来说,这通常被描述为:回调是异步进行的。

一个简单的事件流可以解释什么是最好的:

  1. 你叫getPositionSuccess()
  2. 您可以启动,一个Geoquery来监视范围内的卖家:geoFire.query()
  3. 没有卖家会立即在范围内,所以你的回调不会启动
  4. 完成getPositionSuccess()函数并退出
  5. 卖家的范围很广
  6. GeoFire触发key_entered事件并运行回调
  7. 但是getPositionSuccess()已经退出了,那么它如何返回值呢?

即使您在返回之前等待第一个卖方进入范围(在浏览器中不可能,但在其他语言/环境中是可能的),当第二个卖方在范围内时,您将如何返回值?

因此,您必须以不同的方式处理异步数据。通常,您可以通过将调用getPositionSuccess()函数的代码移动到函数中来完成这一任务。

假设你现在正试图这样做:

代码语言:javascript
复制
var sellers = getPositionSuccess(pos);
sellers.forEach(function(seller) {
  addSellerToMap(seller);
});

要处理事件的异步性质,您可以将这段代码移动到getPositionSuccess

代码语言:javascript
复制
//Callback function from html 5 geo api
function getPositionSuccess(pos) {
    var crd = pos.coords;
    var currentPosition = [crd.latitude, crd.longitude];

    // Query radius
    var radiusInKm = 2;

    var firebaseRef = new Firebase(FBURL + "/geofire/sellers/");
    var geoFire = new GeoFire(firebaseRef);

    var geoQuery = geoFire.query({
        center: currentPosition,
        radius: radiusInKm
    }); 

    var oneSeller = {}; 

    geoQuery.on("key_entered", function(key, location, distance) {
        oneSeller = { 
            id: key,
            distance: distance,
            location: location
        };  
        addSellerToMap(oneSeller);
    }); 
} 

我知道在你的用例中,你的卖家不会移动,所以把他们看作静态列表可能更直观。但即使在这种情况下,结果也是从远程数据库加载的,加载数据需要一段时间。现代web异步加载数据,您的所有代码都必须以类似于我前面描述的方式处理它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31499958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档