reactjs - Firebase读取与react useeffect异步不等待文档读取
问题描述
我在身份验证上下文中有以下代码片段,我在上下文中设置了登录详细信息以及用户特定的详细信息。但是问题是代码退出了 useEffect 块,即使我使用异步来完成文档读取。但是代码无论如何都会通过 useEffect 并且在那之后检索用户详细信息。
我想在控制失去 useEffect 之前阅读文档。
请让我知道我做错了什么。
useEffect(() => {
auth.onAuthStateChanged(user => {
let userDetails : IUser = {
landingPage: "error",
permissions: {
'none' : {
'read' : false,
'write' : false
}
},
role: "none",
shopId: "none"
};
if (user) {
console.log("Read user data now");
(async function some() {
await readDocument("users", user.uid,function (result: IUser) {
userDetails = result;
console.log("Result received in ", result);
});
})();
}
return setState({
...authInitialState,
isAuthenticated: !!user,
isInitialized: true,
permissions: userDetails.permissions,
user: user,
landingPage: userDetails.landingPage
});
});
}, []);
读取文档功能
function readDocument(collection: string, docId: string, callback: any) {
console.log("Going to read:", docId);
db.collection(collection).doc(docId)
.get()
.then(function (doc) {
callback(doc.data());
console.log("Read data", doc.id, " => ", doc.data());
})
.catch(function (error) {
console.log("Failed to write", error);
});
}
解决方案
为了readDocument
使用它,await
它需要是一个得到解决的承诺。https://itnext.io/javascript-promises-and-async-await-as-fast-as-possible-d7c8c8ff0abc - 向下滚动到 async/await 部分
像这样的东西(未经证实) -
const readDocument = function (collection: string, docId: string, callback: any) {
return new Promise((resolve, reject) => {
db.collection(collection).doc(docId)
.get()
.then(function (doc) {
resolve(doc.data());
console.log("Read data", doc.id, " => ", doc.data());
})
.catch(function (error) {
console.log("Failed to write", error);
reject(error);
});
});
};
推荐阅读
- python-3.x - 来自 AWS 控制台的 AWS 反向迁移设置本地主机
- c - 语法 C,这是什么意思
- c - 而函数C编程
- postgresql - 无法使用托管在 kubernetes 中的 Pyspark 从 PSQL 读取
- javascript - 除了 toString() 之外,还有其他方法可以查看函数的主体吗
- r - 在不使用循环的情况下创建所需的小标题
- reactjs - Can't store navigator.geolocation data in useffect, with a usestate
- php - 适用于 AWS S3 的 PHP 开发工具包使用 ARN 存储桶进行身份验证
- html - 为什么边距折叠不起作用?我错过了什么?
- android - 错误:无法解析 C:\Users\aNTA\AndroidStudioProjects\breaking\app\src\main\AndroidManifest.xml 中的 XML