【问题标题】:Angular firebase persistence fetch new data from firestoreAngular firebase 持久性从 firestore 获取新数据
【发布时间】:2020-01-27 04:02:26
【问题描述】:

我使用 angularfirebase 创建了一个带有 Firestore 的 Angular 8 应用程序。
该应用程序应该可以离线工作,这可以通过在 firebase 上启用持久性来正常工作。 (并为 Angular 创建一个 serviceworker 等)。
现在我像这样从 Firestore 中获取我的数据

public async get(): Promise<Customer[]> {
  return await this.itemsCollection.valueChanges({ idField: 'id' }).pipe(take(1)).toPromise();
}

我不喜欢使用异步管道方法的 observables,因为它让一切都变得过于复杂。

我现在遇到的问题是,如果我在 firestore 本身或另一台设备上更新某些数据,则本地数据不会更新。刷新页面后,它会继续获取旧的缓存 Firestore 数据。 我试图通过清除持久性缓存来解决这个问题,但我不知道将它放在我的代码中的哪个位置以使其工作。

private db: AngularFirestore, // in constructor
this.db.firestore.clearPersistence(); // somewhere after initializing firebase

我也认为这不是一个很好的生产就绪解决方案。

我该如何解决这个问题?
也许我应该去寻找可观察对象并重写所有内容。

【问题讨论】:

  • 听起来你确实想要一个Observable,它是一个数据流,而Promise 只给你一个一次性的值。如果您希望实时更新值,请重新考虑使用带有 Observables 的异步管道。
  • 不,它不需要实时更新,但是当我刷新页面时,我希望得到新数据而不是本地缓存数据

标签: angular firebase google-cloud-firestore persistence offline


【解决方案1】:

我认为valueChanges 这里可能不是正确的方法。既然您不需要实时更新,为什么不使用简单的get 重新加载每个页面?

firebase 来源:https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document

get 调用将返回Promise,因此无需转换它。 persistence 只有在应用离线时才会成为问题。仅建议出于测试目的清除持久性,因此在生产中避免它是正确的。

angularfire 示例,其中 .get() 返回一个 observable:

public async get(): Promise<Customer[]> {
    return await this.itemsCollection.get().pipe(map(
      items => items.docs.map(doc => doc.data() as Customer)
    )).toPromise();
  }

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 2020-07-14
    • 2018-11-06
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多