Thắ*_*hắc 5 javascript firebase react-native google-cloud-firestore
我在查询 1 个集合 User-> UidUser-> InfoUser (POST (Collection), name, age ...) 中的所有数据时遇到问题
然后我使用下面的代码来获取 collectionsGroup (Post) 但是如何获取用户的姓名和年龄?
当我使用 2 个嵌套循环时,另一个问题是 forEach 不能在里面使用 Await 和 Async 使我丢失数据。
getData = async () => {
await firebase.firestore().collection('user').doc(Fire.shared.uid).onSnapshot(documentSnapshot => {
firebase.firestore().collectionGroup('Post').where('uid', 'in',
documentSnapshot.data().Followings).get().then(querySnapshot => {
const Post = [];
querySnapshot.forEach(post => {
Post.push({ data: post.data() }) // This is correct and get full data's Post
});
this.setState({ dataPost: Post })
})
})
}
Run Code Online (Sandbox Code Playgroud)
await firebase.firestore().collection('user').doc(Fire.shared.uid).onSnapshot(documentSnapshot => {
firebase.firestore().collectionGroup('Post').where('uid', 'in', documentSnapshot.data().Followings).get().then(querySnapshot => {
const Post = [];
querySnapshot.forEach(async (post) => {
// Incorrect because forEach don't wait callback => Lose a documents's user //
await firebase.firestore().collection('user').doc(post.data().id).onSnapshot(user => {
Post.push({ data: post.data(),user: documentSnapshot.data() })
})
});
this.setState({ dataPost: Post })
})
})
Run Code Online (Sandbox Code Playgroud)
我认为 Promise.all 可以解决这个问题
firebase.firestore()
.collection("user")
.doc(Fire.shared.uid)
.onSnapshot((documentSnapshot) => {
firebase
.firestore()
.collectionGroup("Post")
.where("uid", "in", documentSnapshot.data().Followings)
.get()
.then((querySnapshot) => {
const Post = [];
querySnapshot.forEach((post) => {
Post.push(new Promise((resolve, reject) => {
firebase
.firestore()
.collection("user")
.doc(post.data().id)
.onSnapshot((user) => {
resolve({ data: post.data(), user: documentSnapshot.data() });
});
}))
});
Promise.all(Post).then(res => {
console.log(res)
this.setState({ dataPost: res})
})
});
});
Run Code Online (Sandbox Code Playgroud)
我通过一个带有 setTimeout 函数和 forEach 函数的简单示例展示了它是如何工作的,也许它可以帮助其他人在面临此类问题时
firebase.firestore()
.collection("user")
.doc(Fire.shared.uid)
.onSnapshot((documentSnapshot) => {
firebase
.firestore()
.collectionGroup("Post")
.where("uid", "in", documentSnapshot.data().Followings)
.get()
.then((querySnapshot) => {
const Post = [];
querySnapshot.forEach((post) => {
Post.push(new Promise((resolve, reject) => {
firebase
.firestore()
.collection("user")
.doc(post.data().id)
.onSnapshot((user) => {
resolve({ data: post.data(), user: documentSnapshot.data() });
});
}))
});
Promise.all(Post).then(res => {
console.log(res)
this.setState({ dataPost: res})
})
});
});
Run Code Online (Sandbox Code Playgroud)
async function call() {
const nums = [1, 2, 3, 4, 5];
const promises = [];
nums.forEach((res) => {
setTimeout(() => {
promises.push(res*2);
}, 10000);
});
console.log(promises);
}
call();Run Code Online (Sandbox Code Playgroud)
在上面的示例中,输出是一个空数组,因此我找到了解决此问题的方法
async function call() {
const nums = [1, 2, 3, 4, 5];
const promises = [];
nums.forEach((res) => {
setTimeout(() => {
promises.push(res*2);
}, 10000);
});
Promise.all(promises).then((res) => {
console.log("res", res);
});
}
call();Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |