我是Firebase + GeoFire的新手,geoFire查询函数有问题。
我希望将geoQuery函数的结果添加到数组中,并将其返回到函数中。但是我在geoQuery.on方法中操作的数据似乎超出了范围,或者无法获得,或者由于承诺,我不知道。事实上,在geoquery.on方法之外,变量卖家是空的。
如何返回geoQuery的结果并将其保存到返回变量中
//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的地理定位有多精确?桌面浏览器和移动浏览器有区别吗?
发布于 2015-07-19 15:49:20
Geofire 监控卖家在你所指的范围内。每当卖方进入/退出范围时,它都会触发一个key_entered或key_exited事件。这些事件可以在启动查询后的任何时候发生。用JavaScript术语来说,这通常被描述为:回调是异步进行的。
一个简单的事件流可以解释什么是最好的:
getPositionSuccess()geoFire.query()getPositionSuccess()函数并退出key_entered事件并运行回调getPositionSuccess()已经退出了,那么它如何返回值呢?即使您在返回之前等待第一个卖方进入范围(在浏览器中不可能,但在其他语言/环境中是可能的),当第二个卖方在范围内时,您将如何返回值?
因此,您必须以不同的方式处理异步数据。通常,您可以通过将调用getPositionSuccess()函数的代码移动到函数中来完成这一任务。
假设你现在正试图这样做:
var sellers = getPositionSuccess(pos);
sellers.forEach(function(seller) {
addSellerToMap(seller);
});要处理事件的异步性质,您可以将这段代码移动到getPositionSuccess中
//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异步加载数据,您的所有代码都必须以类似于我前面描述的方式处理它。
https://stackoverflow.com/questions/31499958
复制相似问题