如何在 firestore 快照中获取多个引用
How to get multiple references in a firestore snapshot
我有一个包含 post 个文档的 firestore 集合,每个文档都包含对作者(用户)和案例文档的引用。
如何在同一个 onSnapshot 中获取用户和案例?
这是我想用 await 做的事情,但这似乎不是 react-native-firebase 的一个选项。
export const firebasePostLooper = (snapshot) => {
let data = [];
snapshot.forEach(async (doc) => {
let newItem = {id: doc.id, ...doc.data()};
if (newItem.author) {
let authorData = await getDoc(newItem.author); // doesn't work with rnfirebase
if (authorData.exists()) {
newItem.userData = {userID: authorData.id, ...authorData.data()};
}
}
if (newItem.case) {
let caseData = await getDoc(newItem.case);
if (caseData.exists()) {
newItem.userData = {userID: caseData.id, ...caseData.data()};
}
}
data.push(newItem);
});
return data;
};
这不起作用,因为 getDoc()
不存在。
所以我只剩下使用 .then()
export const firebasePostLooper = (snapshot) => {
let data = [];
snapshot.forEach((doc) => {
let newItem = {id: doc.id, ...doc.data()};
if (newItem.author) {
newItem.author
.get()
.then((res) => {
newItem.authorData = res.data();
if (newItem.case) {
newItem.case
.get()
.then((caseRes) => {
newItem.caseData = caseRes.data();
data.push(newItem);
})
.catch((err) => console.error(err));
}
})
.catch((err) => console.error(err));
} else {
data.push(newItem);
}
});
return data;
};
第二种方法似乎不起作用,return 语句中的数据为空,但 data.push(newItem)
包含带有 2 个引用文档的正确文档。
您正在 returning 数据,然后它才被填充到 promise 中。您应该在 .then() 中处理 returning 数据,以便 return 在 promise 解决之后而不是之前。
看看这个例子,如果我们在 promise 链之外处理 emptyData 对象,我们只是 return 它被填充之前的初始值。
let promise = new Promise((resolve, reject)=>{
setTimeout(resolve, 1000, 'foo');
})
let emptyData= [];
let notEmptyData = [];
promise
.then(res=>{
emptyData.push(res);
notEmptyData.push(res);
console.log("Full data: " + notEmptyData) // "Full data: foo"
});
console.log("Empty data: " + emptyData); // "Empty data: "
我有一个包含 post 个文档的 firestore 集合,每个文档都包含对作者(用户)和案例文档的引用。
如何在同一个 onSnapshot 中获取用户和案例?
这是我想用 await 做的事情,但这似乎不是 react-native-firebase 的一个选项。
export const firebasePostLooper = (snapshot) => {
let data = [];
snapshot.forEach(async (doc) => {
let newItem = {id: doc.id, ...doc.data()};
if (newItem.author) {
let authorData = await getDoc(newItem.author); // doesn't work with rnfirebase
if (authorData.exists()) {
newItem.userData = {userID: authorData.id, ...authorData.data()};
}
}
if (newItem.case) {
let caseData = await getDoc(newItem.case);
if (caseData.exists()) {
newItem.userData = {userID: caseData.id, ...caseData.data()};
}
}
data.push(newItem);
});
return data;
};
这不起作用,因为 getDoc()
不存在。
所以我只剩下使用 .then()
export const firebasePostLooper = (snapshot) => {
let data = [];
snapshot.forEach((doc) => {
let newItem = {id: doc.id, ...doc.data()};
if (newItem.author) {
newItem.author
.get()
.then((res) => {
newItem.authorData = res.data();
if (newItem.case) {
newItem.case
.get()
.then((caseRes) => {
newItem.caseData = caseRes.data();
data.push(newItem);
})
.catch((err) => console.error(err));
}
})
.catch((err) => console.error(err));
} else {
data.push(newItem);
}
});
return data;
};
第二种方法似乎不起作用,return 语句中的数据为空,但 data.push(newItem)
包含带有 2 个引用文档的正确文档。
您正在 returning 数据,然后它才被填充到 promise 中。您应该在 .then() 中处理 returning 数据,以便 return 在 promise 解决之后而不是之前。
看看这个例子,如果我们在 promise 链之外处理 emptyData 对象,我们只是 return 它被填充之前的初始值。
let promise = new Promise((resolve, reject)=>{
setTimeout(resolve, 1000, 'foo');
})
let emptyData= [];
let notEmptyData = [];
promise
.then(res=>{
emptyData.push(res);
notEmptyData.push(res);
console.log("Full data: " + notEmptyData) // "Full data: foo"
});
console.log("Empty data: " + emptyData); // "Empty data: "