Лог c, извлекающий документ из Firestore, является асинхронным. Однако вызов setState
является синхронным. Всегда будет до документа, выбранного. Решением было бы получить документы , а затем установить состояние. Вот пример:
const UsersScreen = (props) => {
const [state, setState] = useState({
users: [],
});
const getUserProfiles = () => {
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);
};
Вызов Promise.all
разрешается, как только каждый пользователь был извлечен из Firestore (хотя, возможно, вы могли бы получить их сразу же). Как только у нас есть пользователи, мы l oop над ними с map
, чтобы извлечь данные документа и установить состояние. Вот альтернатива с async/await
:
const UsersScreen = (props) => {
const [state, setState] = useState({
users: [],
});
const getUserProfiles = async () => {
try {
const docs = await Promise.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);
};