angular - Rxjs 如何在智能组件中等待所有来自动态组件的 observables 完成

标签 angular highcharts rxjs

你好,

在我的项目中,我想通过单击页面上的按钮进行导出 (PDF)。在我的页面中,我有一个动态创建多个图表的仪表板。当我点击“导出”按钮时,我想通知每个动态组件从当前图表实例创建一个 svg 并将其传递给“页面”组件。为了能够创建 svg,我必须等到创建图表实例。当我拥有来自不同动态组件的所有 svg 时,我能够将信息(不同的 svg)传递给将创建 pdf 的 api 调用的主体。

所以我试图在 test project 中实现这一点.我不知道正确的方法,所以我尝试用动态组件中的 observable 填充服务中的数组。

我遇到的问题是,在登陆页面组件中执行 forkjoin 之前,我如何知道动态组件中的所有可观察对象(当它失败时返回 SVG 或错误)都被添加到数组中。我的 forkJoin 也没有返回 svg,所以我做错了。但也许有更好的方法来等待所有动态组件,直到他们创建他们的 svg。

最佳答案

我认为问题是当chartInstanceStream$发出,它没有订阅者,这意味着它无法完成,因为 first() ,这也意味着 forkJoin除非所有提供的 observable 至少发出一次并完成,否则不会发出。
chartInstanceStream$由于 setChartInstance 发出,发生在 testService.clickExportPdfStream 之前发出。

一种快速解决方法是转 chartInstanceStreamReplaySubject以便它将其最新值重播给迟到的订阅者。

所以,从这个:

chartInstanceStream$ = new Subject<Highcharts.Chart>();

对此:

chartInstanceStream$ = new ReplaySubject<Highcharts.Chart>(1);
forkJoin内部订阅所有提供的 observables。通过转换 chartInstanceStream$ReplaySubject ,您要确保迟到的订阅者(来自 forkJoin 的订阅者)将收到由 ReplaySubject 发出的最旧的值。 .

并且因为你的观察结果 forkJoin订阅看起来像这样:

this.chartInstanceStream$.pipe(
    map((chart: Highcharts.Chart) =>
      chart.getSVG()
    ),
    first() // !
  )

由于 first(),当它们发出一个值后,它们也会立即完成。 .

关于angular - Rxjs 如何在智能组件中等待所有来自动态组件的 observables 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61588515/

相关文章:

Angular 8 拦截和修改Http错误响应

angular - 如何更新异步管道中使用的 Observable?

Angular 6等待订阅完成

angular - 如何在 Webstorm 的 Angular 2 模板中删除背景颜色

typescript - 使用 angular2 组件(没有 forwardRef)实现递归结构?

javascript - 我可以使用 Highcharts 为每个饼图分配不同的半径吗?

javascript - 如何在 Highstock 中同步“从到”日期包装器?

javascript - 如何在 HighCharts 折线图中选择性地在某些点显示标签

javascript - RxJS:我应该如何通过socket.js事件更新observable中的元素?

javascript - 从 Landing 导航到 Ionic 2+ 中的特定选项卡动态