首页 > 解决方案 > 如何解决嵌套 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);
    })
},[])

谢谢

标签: reactjsfirebase

解决方案


您的问题是您实际上是在一个非异步的循环中解决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);
}

推荐阅读