Javascript 读取一个Firebase数据库条目一次并返回其值
我正试图从firebase数据库条目中获取数据。用例如下:我将查询一个带有纬度、经度和半径的web API,该API使用GeoQuery库进行查询,该库提供与数据库条目键关联的数据库结构。我使用由事件管理器输入的密钥来触发所有匹配的位置数据库条目 现在我想检查关联的数据戳时间戳是否比现在更新,但我在从承诺中获取数据时遇到了一些困难。我知道由于承诺的异步性质,下面的代码不起作用,但是有没有可能将once的数据与变量关联起来,例如等待承诺返回某些内容,直到继续(如WAIT等) 我完全了解node.js的异步性质,但我必须将数据返回到res.send,因为它提供了一个封闭的API调用 我还使用了一个回调函数来调用db查询承诺,并试图将其与数据关联起来,但效果并不理想Javascript 读取一个Firebase数据库条目一次并返回其值,javascript,node.js,firebase,asynchronous,es6-promise,Javascript,Node.js,Firebase,Asynchronous,Es6 Promise,我正试图从firebase数据库条目中获取数据。用例如下:我将查询一个带有纬度、经度和半径的web API,该API使用GeoQuery库进行查询,该库提供与数据库条目键关联的数据库结构。我使用由事件管理器输入的密钥来触发所有匹配的位置数据库条目 现在我想检查关联的数据戳时间戳是否比现在更新,但我在从承诺中获取数据时遇到了一些困难。我知道由于承诺的异步性质,下面的代码不起作用,但是有没有可能将once的数据与变量关联起来,例如等待承诺返回某些内容,直到继续(如WAIT等) 我完全了解node.j
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);
}
}我通过链接承诺自己解决了这个问题。也许有点过于复杂,但我正在努力
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);
}
}
函数查询地理位置(req,res){
试一试{
常量lat=parseFloat(请求参数lat);
const long=parseFloat(请求参数long);
常量半径=解析浮点(要求参数半径);
让geoQuery=geoFire.query({center:[lat,long],radius:radius});
getGeoData=函数(geoQuery){
返回新承诺(功能(解决、拒绝){
数据=新的查询数据();
geoQuery.on(“输入键”),(键、位置、距离)=>{
数据。添加(键、loc、dist);
});
geoQuery.on('ready',()=>{
geoQuery.cancel();
解析(data.getData());
});
});
};
dbQuery=函数(键){
返回新承诺(功能(解决、拒绝){
admin.database().ref(“/events/”).child(key).on('value',(data)=>{
if(Date.parse(data.val().Date){
如果(!isNewer)
删除地理数据[键];
});
}
}
解析(地理数据);
});
};
getGeoData(geoQuery).then(checkIfDateIsNewer).then(函数(数据){
res.send(数据);
}).catch((错误)=>{
res.status(500).发送(“错误:+err”);
});
}捕捉(错误){
res.status(500).发送(“错误:+err”);
}
}
这里真正应该做的是让queryGeoLocation返回一个承诺,该承诺可以解决调用者需要的数据。调用方可以使用该承诺对数据可用性做出反应,方法是在该承诺上使用then()。是的,这对我来说是一个很好的方法。我不知道我可以在http请求中返回承诺。我目前在客户端使用的XMLHttpRequest是否可以处理这样的返回?有一个名为request promise的node.js模块,它返回一个承诺,在HTTP请求完成时解析:不幸的是,我没有完全理解它。我想做的是获取多个位于查询位置附近的条目,据我所知,我无法用一个承诺来处理这个问题。另外,还有关于承诺如何实际工作的文档吗?它是否允许http连接打开,直到数据交换,请求承诺是否考虑到了这一点,还是http请求的简单承诺?