【问题标题】:Akita Observable OnCompleted Never FiresAkita Observable OnCompleted 从不触发
【发布时间】:2019-06-26 19:32:42
【问题描述】:

在我的 Angular 8 应用程序中,我调用 Api 服务,然后将数据写入 Akita Entity Store 以用于后续请求。我通过使用 mergeMap 以同步方式发送请求来做到这一点。

我有一些额外的请求,我希望使用带有此函数的 forkJoin 以并发方式执行,但是,我发现 akita selectAll 函数的以下问题不会触发 onCompleted 函数/事件。它返回数据但 onCompleted 永远不会触发。使 Observable 处于不完整状态。

如果我删除对秋田实体商店的调用。我可以看到函数完成的对 getTeams Observable 的 Api 调用。我向秋田实体商店调用添加了调试代码,并看到 onCompleted 永远不会触发。我不知道为什么,但也许我做错了什么。

功能:

   getTeams(): Observable<Team[]> {
     return this.teamApiService.getTeams().pipe(
      mergeMap((teams) => {
        this.teamStore.set(teams);
        return this.teamQuery.selectAll({ sortBy: 'name' });
      })
     );
   }

调用函数:


   this.teamStateService.getTeams().subscribe(
      data => console.log('GOT getTeams:', data),
      err => console.log('Error:', err),
      () => console.log('getTeams: Completed')
    );

我应该看到以下结果:

GOT getTeams: .... 
getTeams: Completed

但是,我只是明白了

GOT getTeams: ....

【问题讨论】:

  • 是什么让您认为您应该看到这些结果?
  • @Jota.Toledo - 如果我删除对 Akita observable selectAll 函数的调用,我会得到想要的结果。我假设如果对可观察 api 函数 getTeams 的调用完成,然后可观察 selectAll 完成,则 getTeams 将被标记为完成。然而,也许,我在想这个太像承诺了。我只是不太确定如何处理它。
  • 你没有想太多,确实你的逻辑是对的。唯一的问题是您做出了错误的假设;商店选择器返回的可观察对象不完整。商店是“永不”关闭的事件源,因此从它创建的任何流都是无限的。
  • 有趣。没想到EntitiyStore的入口和出口是这样使用的。如果我要使用执行并行请求的东西,例如 forkJoin,我将无法将它与 akita 一起使用,因为它正在为每个 observable 寻找“完成”状态。我将不得不寻找另一种方式。感谢您的信息。

标签: angular observable angular-akita


【解决方案1】:

您可以强制它完成。可以加take(1)

return this.teamQuery.selectAll({ sortBy: 'name' }).pipe(take(1));

【讨论】:

  • 我试过了,它似乎工作正常。我将做更多的测试,看看它是否成功。
  • 我已经确认这确实解决了我的问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多