Я думаю, что проблема в том, что когда chartInstanceStream$
излучает, у него нет подписчиков, что означает, что он не может завершиться из-за first()
, что также означает, что forkJoin
не будет излучать, пока не будут отправлены все предоставленные наблюдаемые по крайней мере, один раз и завершено.
chartInstanceStream$
испускается из-за setChartInstance
, что происходит до того, как testService.clickExportPdfStream
испускает.
Одним быстрым решением было бы превратить chartInstanceStream
в ReplaySubject
чтобы он воспроизвел свои последние значения для поздних подписчиков .
Итак, с этого:
chartInstanceStream$ = new Subject<Highcharts.Chart>();
до this:
chartInstanceStream$ = new ReplaySubject<Highcharts.Chart>(1);
forkJoin
внутренне подписывается на все предоставляемые наблюдаемые. Преобразуя chartInstanceStream$
в ReplaySubject
, вы гарантируете, что поздние подписчики (из forkJoin
) получат самое старое значение, испускаемое ReplaySubject
.
И поскольку ваши наблюдаемые, которые forkJoin
подписывается, чтобы выглядеть следующим образом:
this.chartInstanceStream$.pipe(
map((chart: Highcharts.Chart) =>
chart.getSVG()
),
first() // !
)
после того, как они передают одно значение, они также будут немедленно завершены, из-за first()
.