1

我对模块中CollectionService()可用的方法有疑问。akita-ng-fire我创建了一个扩展 CollectionService() 的服务,并使用 syncCollection 来保持 firestore 文档和我的 Web 客户端之间的同步。这是服务定义的样子:

@Injectable({providedIn: 'root'})
@CollectionConfig({path: 'someDoc/:customId/anotherDoc'})
export class MyService extends CollectionService<WorkspaceState> {

    constructor(store: WorkspaceStore) {
        super(store);
        this.store.setHasCache(true, {restartTTL: true});
    }

    // service methods ......
}

我在组件的指令中使用它onInit来初始化同步。

    ngOnInit() {
        this.sub = this.myService.syncCollection().pipe(
            concatMap(_ => this.query.myDoc$.pipe(
                tap(d => this.myService.markActive(d.customId)),
                tap(d => this.customId = d.customId),
            )),
            tap(d => this.router.navigate(['somePlace', d. customId])),
        ).subscribe();
    }

但是,我看到此同步每分钟会进行约 5 次读取。有没有办法减少这种情况?我觉得这对我来说很昂贵,因为我们将此服务作为核心服务,用于与关键业务文档保持同步。

来自社区的任何建议都会有所帮助

4

2 回答 2

5

syncCollection聆听您收藏的每个文档的每一次更改。这是很好的开始,但是一旦您的应用程序增长,您希望更加精确。

  1. 仅在需要时同步syncCollection用于具有列表syncDoc的页面和具有单个视图的页面。离开页面时不要忘记取消订阅(我喜欢为此目的使用 Guards)。
  2. 如果您不需要始终保持最新状态,请考虑使用快照而不是getValue. 在某些情况下,您不想像非协作表单或仅显示一个不应更改的键的列表那样实时执行读取。在这种情况下,您可以getValue()用于集合或getValue(id)文档。
  3. 使用 queryFn 来监听更少的文档。大多数时候,您不想获取整个集合,而只想获取其中的一个子集:syncCollection(ref => ref.limitTo(10).where(...).
  4. 不要太担心价格。您将支付一些€/百万阅读。你花在优化它上的时间对你的公司来说会比 firebase 的读取成本要高得多。编写代码时将价格牢记在心,但不要花太多时间优化事物;)。

作为旁注,我认为这setHasCache不会在这里产生任何影响。Firebase 使用 IndexedDB 缓存您已经使用的数据。因此,如果自上次以来没有任何变化,您无需为此付费。

于 2020-01-26T18:39:17.570 回答
1

使用first运算符在收到数据时自动取消订阅

    ngOnInit() {
        this.sub = this.myService.syncCollection().pipe(
            concatMap(_ => this.query.myDoc$.pipe(
                tap(d => this.myService.markActive(d.customId)),
                tap(d => this.customId = d.customId),
            )),
            
            first((d) => {
              const hasData = !!d;
              return hasData;
            })
            tap(d => this.router.navigate(['somePlace', d. customId])),
        ).subscribe();
    }

于 2020-01-26T14:42:22.027 回答