我试图从firebase数据库条目中获取数据。用例如下:我将查询具有纬度,经度和半径的Web API,该查询使用GeoQuery库,该库提供与数据库条目密钥关联的数据库结构。我使用key_entered事件管理器来触发所有匹配的位置数据库条目。
我现在想检查关联的数据时间戳是否比现在更新,但是我有一些努力将数据从Promise中取出。我知道由于Promises的异步性质,下面的代码不起作用,但是有可能将一次数据与变量相关联,例如,等待Promise返回一些东西直到继续(如等待等)?
我完全了解node.js的异步性质,但是我必须将数据返回到res.send,因为它提供了一个封闭的API调用。
我还使用了一个回调函数来调用db查询promise,并试图将它与数据相关联,但这些数据也没有用。
function queryGeoLocation(req, res) {
try {
const lat = parseFloat(req.params.lat);
const long = parseFloat(req.params.long);
const radius = parseFloat(req.params.radius);
let geoQuery = geoFire.query({center: [lat, long], radius: radius});
data = new QueryData(); //Use this to handle data asynchronously
geoQuery.on("key_entered", (key, loc, dist) => {
isFutureEvent = false;
admin.database().ref("/events/").child(key).once("value").then((snapshot) => {
if(Date.parse(snapshot.val().date) >= Date.now())
isFutureEvent = true;
}).catch(() => {
});
console.log(isFutureEvent);
if (isFutureEvent){
data.add(key, loc, dist);
}
});
// When ready directly cancel the query provider and return data (since we only want to read once)
geoQuery.on('ready', () => {
geoQuery.cancel();
res.send(data.getData());
});
} catch (err) {
res.status(500).send("Error: " + err);
}
}
答案 0 :(得分:0)
我通过链接Promises来弄清楚自己。也许有点过于复杂但我正在努力。
function queryGeoLocation(req, res) {
try {
const lat = parseFloat(req.params.lat);
const long = parseFloat(req.params.long);
const radius = parseFloat(req.params.radius);
let geoQuery = geoFire.query({center: [lat, long], radius: radius});
getGeoData = function(geoQuery) {
return new Promise(function (resolve, reject) {
data = new QueryData();
geoQuery.on("key_entered", (key, loc, dist) => {
data.add(key, loc, dist);
});
geoQuery.on('ready', () => {
geoQuery.cancel();
resolve(data.getData());
});
});
};
dbQuery = function (key) {
return new Promise(function(resolve, reject) {
admin.database().ref("/events/").child(key).on('value', (data) => {
if (Date.parse(data.val().date) < Date.now())
resolve(false);
else
resolve(true);
});
});
};
checkIfDateIsNewer = function(geoData) {
return new Promise(function (resolve, reject) {
for (let key in geoData){
if(geoData.hasOwnProperty(key)) {
dbQuery(key).then((isNewer) => {
if (!isNewer)
delete geoData[key];
});
}
}
resolve(geoData);
});
};
getGeoData(geoQuery).then(checkIfDateIsNewer).then(function(data) {
res.send(data);
}).catch((err) => {
res.status(500).send("Error: " + err);
});
} catch (err) {
res.status(500).send("Error: " + err);
}
}