reactjs - 如何解决嵌套 Firebase 查询的承诺?
问题描述
我正在尝试获取在不同集合中引用的特定文档。到目前为止我得到的代码是这样的,但是 useEffect 中的承诺没有及时解决。
结构如下:
conversations -> id -> {users : [users_id, user_id]}
目的是获取每个特定对话的用户个人资料
我在 promises 数组中到底做错了什么?
或者也许有更好的方法从不同的集合中获取引用的 id?
const conversationsRef = firestore.collection("conversations").where("users", "array-contains", auth.currentUser.uid).orderBy("updatedAt", "desc");
const [convo, set] = useState([]);
async function getConversations(){
let test = []
await conversationsRef.onSnapshot((snap) => {
snap.forEach((doc) => {
let conversation = doc.data();
conversation.users.forEach((user) => {
if(user != auth.currentUser.uid){
firestore.collection("users").doc(user).get().then((user_profile) =>{
conversation.po = user_profile.data();
test.push(conversation);
});
}
});
})
});
return Promise.all(test);
}
useEffect(()=>{
getConversations().then((data) => {
console.log(data)
console.log(data[0]?.hostId);
setActiveChat(data[0]);
set(data);
})
},[])
谢谢
解决方案
您的问题是您实际上是在一个非异步的循环中解决firestore.collection('users')
承诺。forEach
您没有向Promise.all
. conversation
您需要推送返回承诺的实际函数,而不是push firestore.collection("users").doc(user).get()
。尝试这个:
async function getConversations(){
const promises = []
await conversationsRef.onSnapshot((snap) => {
snap.forEach((doc) => {
let conversation = doc.data();
conversation.users.forEach((user) => {
if(user != auth.currentUser.uid){
promises.push(firestore.collection("users").doc(user).get())
}
});
})
});
return Promise.all(promises);
}
推荐阅读
- javascript - 无法打开从我的网站下载的 zip 文件
- android - 如何使用导航组件向变化的片段添加动画?
- python - Python 崩溃,进程以退出代码 -1073741819 (0xC0000005) 完成
- javascript - 使用 JavaScript 的 WP REST API 发布状态
- javascript - Paypal - 在弹出窗口中授权重定向父窗口而不是弹出窗口
- javascript - 如何在javascript上为图像添加页脚?
- java - GAE 应用程序日志尾部包含应用程序的日志,而不仅仅是 http 请求日志
- java - (错误)无法找到或加载主类
- python - 无法使用python发送http请求,只能发送到https
- r - 提取字符之间的字符串