gpt4 book ai didi

javascript - 如何使用 Cloud Functions 在 Firebase 中实时同步进行子查询

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:17 26 4
gpt4 key购买 nike

我使用带有 JavaScript 的 Firebase 函数来查询 Firebase 实时信息,该查询将在 Android 应用程序中使用。主查询获取值的集合,然后我将遍历这些值,并针对每个值启动另一个查询。从第二个查询获得的结果存储在一个数组中,该数组就是我作为结果返回的数组。

问题是我作为答案返回的数组是空的,因为响应是在将数据添加到数组末尾的子查询之前返回的,也就是说,我认为问题是由于调用的异步性质造成的。

我尝试以多种方式重新组织代码,并使用 Promise 尝试在所有查询完成后才发送结果,但同样的问题仍然发生。

我查阅的JSON数据库的结构如下:

"users" : {
"uidUser" : {
"friends" : {
"uidUserFriend" : "mail"
},
"name" : "nameUser",
...
},

"uidUser2" : {
"friends" : {
"uidUserFriend" : "mail"
},
"name" : "nameUser",
...
}

}

功能是:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.searchFriends = functions.https.onCall((data,context) => {
const db = admin.database();
const uidUser = data.uidUser;
var arrayOfResults = new Array();

const refFriends = db.ref('/users/'+uidUser+'/friends');
let user;

return refFriends.once('value').then((snapshot) => {
snapshot.forEach(function(userSnapshot){
user = findUser(userSnapshot.key);
arrayOfResults.push(user);
});
return {
users: arrayOfResults
};
}).catch((error) => {
throw new functions.https.HttpsError('unknown', error.message, error);
});

});

function findUser(uid){
const db = admin.database();
const ref = db.ref('/users/'+uid);
return ref.once('value').then((snapshot) => {
console.log(snapshot.key,snapshot.val());
return snapshot.val();
}).catch((error) => {
console.log("Error in the query - "+error);
});
}

我不知道问题是因为我没有很好地管理 promise ,还是因为我必须以另一种方式调整代码。谢谢。

最佳答案

确实,正如您所提到的,您应该以不同的方式“管理 promise ”。由于您并行触发多个异步操作(使用 once() 方法,该方法返回一个 promise ),因此您必须使用 Promise.all()

下面的代码应该可以解决问题:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();

exports.searchFriends = functions.https.onCall((data,context) => {
const db = admin.database();
const uidUser = data.uidUser;
var arrayOfPromises = new Array();

const refFriends = db.ref('/users/' + uidUser + '/friends');
let user;

return refFriends.once('value').then(snapshot => {
snapshot.forEach(userSnapshot => {
user = findUser(userSnapshot.key);
arrayOfPromises.push(user);
});
return Promise.all(arrayOfPromises);
})
.then(arrayOfResults => {
return {
users: arrayOfResults
};
})
.catch((error) => {
throw new functions.https.HttpsError('unknown', error.message, error);
});

});

function findUser(uid){
const db = admin.database();
const ref = db.ref('/users/' + uid);
return ref.once('value').then(snapshot => {
console.log(snapshot.key,snapshot.val());
return snapshot.val();
});
}

请注意,我已将第一个数组的名称修改为 arrayOfPromises,恕我直言,这更有意义。

另请注意,您会在与履行值相对应的数组中收到 Promise.all() 的结果与查询数组的顺序相同,请参阅:Promise.all: Order of resolved values

关于javascript - 如何使用 Cloud Functions 在 Firebase 中实时同步进行子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55713271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com