如何解决如何等待 forEach 循环完成
我在尝试获取数据时遇到问题。不幸的是,当我控制台记录结果时,在初始页面加载时,数据为空。然而,当我重新渲染组件时,我成功接收到数据。
这是我目前拥有的:
function Followers({
urlname,navigation
}) {
const [followersData,setfollowersData] = useState(null)
useEffect(() => {
// Fetch Followers data
const dataRef = firestore().collection('usernames')
dataRef.doc(urlname)
.collection('Following')
.get()
.then((docSnapshot) => {
let items = []
docSnapshot.forEach(doc => {
let item = {}
// Store followers,display name and follows info
dataRef
.doc(doc.id)
.get()
.then((followerDoc) => {
const data = followerDoc.data();
item.profileName = doc.id
item.displayName = data.userName
item.followerCount = data.followers
item.followingCount = data.following
})
items.push(item)
})
setfollowersData(items)
})
},[])
return (
<>
{console.log('followersData',followersData)}
</>
)
}
export default Followers
我在第一页加载时收到的控制台日志是:
followersData null
followersData [{},{},{],{}]
followersData [{},{}]
当组件再次呈现时,我在控制台日志中收到此信息:
followersData [all my data in 4 different objects gets logged]
解决方法
使用 prev state 为每个 item 分别调用 setfollwersData()
并设置初始状态为空数组。
function Followers({
urlname,navigation
}) {
const [followersData,setfollowersData] = useState([])
useEffect(() => {
// Fetch Followers data
const dataRef = firestore().collection('usernames')
dataRef.doc(urlname)
.collection('Following')
.get()
.then((docSnapshot) => {
docSnapshot.forEach(doc => {
let item = {}
// Store followers,display name and follows info
dataRef
.doc(doc.id)
.get()
.then((followerDoc) => {
const data = followerDoc.data();
item.profileName = doc.id
item.displayName = data.userName
item.followerCount = data.followers
item.followingCount = data.following
setfollowersData(prev => [...prev,item])
})
})
})
},[])
return (
<>
{console.log('followersData',followersData)}
</>
)
}
export default Followers
,
William 的解决方案很好,但作为一种选择,等待所有响应并更新一次状态。
const promises = [];
docSnapshot.forEach((doc) => {
const promise = dataRef
.doc(doc.id)
.get()
.then((followerDoc) => {
const data = followerDoc.data()
return {
profileName: doc.id,displayName: data.userName,followerCount: data.followers,followingCount: data.following,}
});
promises.push(promise);
})
Promise.all(promises).then(setfollowersData);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。