Why Is State Always Empty?
I have thoroughly gone through all the asked question and none of them apply to my problem directly. I am looping through an array of user ids and matching them to get a user from
Solution 1:
The logic that fetches the document from Firestore is asynchronous. The call to setState
is synchronous though. It will always before the document has been fetched. The solution would be to fetch the documents then set the state. Here is an example:
constUsersScreen = (props) => {
const [state, setState] = useState({
users: [],
});
constgetUserProfiles = () => {
Promise.all(networkUsers.map((userID) => db.doc(userId).get()))
.then((docs) => {
setState({ users: docs.map((doc) => doc.data()) });
})
.catch((err) => {
console.log("caught error", error);
});
};
useEffect(() => {
getUserProfiles();
}, []);
console.log("state", state.users);
};
The Promise.all
call resolves once every user has been fetched from the Firestore (maybe you could fetch them at once though). Once we have the users we loop over them with map
to extract the data of the document and set the state. Here is an alternative with async/await
:
constUsersScreen = (props) => {
const [state, setState] = useState({
users: [],
});
const getUserProfiles = async () => {
try {
const docs = awaitPromise.all(
networkUsers.map((userID) => db.doc(userId).get())
);
setState({ users: docs.map((doc) => doc.data()) });
} catch (err) {
console.log("caught error", error);
}
};
useEffect(() => {
getUserProfiles();
}, []);
console.log("state", state.users);
};
Post a Comment for "Why Is State Always Empty?"