javascript - 从实时数据快照中获取对象数组 - Cloud Firestore
问题描述
我正在尝试使用以下代码从 Cloud Firestore 获取实时数据。
export const getRealTimeData = () =>
db
.collection('posts')
.onSnapshot(
(querySnapshot) => {
const posts: any = [];
querySnapshot.forEach((doc) =>
posts.push(Object.assign({
id: doc.id
}, doc.data()))
);
},
);
};
而且,我想使用结果数组在 UI 上显示数据。当我这样做时,结果数组是一个函数,而不是实际的数据数组。
const posts = getRealTimeData();
这是我登录时得到的posts
function () {
i.kT(), o.al(s);
}
谁能指出我哪里出错了?
解决方案
添加的实时侦听onSnapshot()
器与函数调用的返回值不兼容。那是因为随着时间的推移,它们会继续产生新的结果,并且永远不会真正“返回”任何东西。在这种情况下,您应该放弃创建同步 getter 类型函数的想法 - 它们只是不适用于您想要做的事情。
理想情况下,您将使用像 Redux 这样的架构来管理可用的更新。您的实时侦听器会将查询更新发送到商店,而您的组件将订阅该商店以接收这些更新。
如果你不想使用 Redux(这太糟糕了——你真的应该这样做),那么你应该将你的查询包装在一个useEffect 钩子中,然后让你的监听器设置一个状态钩子变量以便你的组件可以接收更新。
推荐阅读
- css - PayPal 按钮的水平布局
- python - 是否有支持对象消息传递的 Python 包?
- machine-learning - Weka 中的不同采样方法
- php - 计算数量和总指定价格
- python - 请求时Google Sheets HttpError 403
- reactjs - 获取 axios 对新窗口或新 url 的响应
- python - 多维数据k-means聚类后的PCA
- reactjs - Vercel: ERROR 错误: 找不到包“esbuild-linux-64”,esbuild 需要这个包
- typescript - 如何使 tsc 将联合类型推断为单一类型?
- dart - 如何在飞镖中获取本周的日期和日期?