javascript - 异步分配后反应不渲染
问题描述
我很确定问题出在异步行为上。我认为这是因为我的 react 应用程序有条件地呈现 whenuserLinks.exists
为 true ,但这仅在 firebase 方法完成后才被分配。关于如何解决这个问题的任何建议?该页面不断呈现一个带有错误的空白屏幕:
react-dom.development.js:13413
Uncaught Error: Objects are not valid as a React child (found: [object Promise]).
If you meant to render a collection of children, use an array instead.
应用程序.js
const User = async ({ match, location }) => {
const userLinks = await firebase.getUserInfo(match.params.user)
return (
<React.Fragment>
{ userLinks.exists ? <h1>Loaded and works!</h1> : <h1>Didn't work</h1> }
</React.Fragment>
firebaseconfig.js
class Firebase {
constructor() {
firebase.initializeApp(firebaseConfig);
this.auth = firebase.auth();
this.db = firebase.firestore();
}
async getUserInfo (username) {
let userInfo = { exists: false }
await this.db.collection("users").doc(username).get().then(doc => {
if (doc.exists) {
console.log("Document data:", doc.data());
userInfo.exists = true;
userInfo = { ...userInfo, links: doc.data().links };
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
return userInfo;
}
export default new Firebase();
解决方案
使用async
/await
不会使代码突然同步运行。你仍然需要注意返回承诺和价值,并把它们冒泡。
在您的代码中,我认为应该是这样的:
async getUserInfo (username) {
return await this.db.collection("users").doc(username).get().then(doc => {
if (doc.exists) {
return { exists: true, links: doc.data().links };
} else {
return { exists: false }
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
}
推荐阅读
- ios - iOS AppIcon 问题
- javascript - 主循环函数不运行嵌套函数
- ruby-on-rails - 将数据库结果分成 4 组
- php - Nginx 服务器无法提供 angular-cli /dist 文件夹
- python - CSV Writer在写入多个变量时包含[],但在写入单个列表时不包含?
- javascript - 在新选项卡中打开后更改html链接的文本颜色?
- c# - 如何将图像转换为拼图?
- git - 如何从另一个提交中复制提交元数据(作者、日期)
- ionic3 - NgIf 不显示
- c# - 使用 Thread.Sleep 或 Task.Delay 似乎不适用于我的代码