Rxjs:在多个观测值发出后从中获取最新值

Rxjs:在多个观测值发出后从中获取最新值,rxjs,rxjs6,rxjs-pipeable-operators,Rxjs,Rxjs6,Rxjs Pipeable Operators,我有多个在页面生命周期内发出值的观察值。例如: chartData$: Observable; tableData$: Observable; filterData$: Observable; 在任何时候,用户都可以单击“下载”按钮,并获得JSON,该JSON结合了最近从每个观察值发出的值: downloadButtonClicked$.pipe( combine chartData$, tableData$ and filterData$ // <- how do I g

我有多个在页面生命周期内发出值的观察值。例如:

chartData$: Observable;
tableData$: Observable;
filterData$: Observable;
在任何时候,用户都可以单击“下载”按钮,并获得JSON,该JSON结合了最近从每个观察值发出的值:

downloadButtonClicked$.pipe(
    combine chartData$, tableData$ and filterData$    // <- how do I get latest values here?
).subscribe(([chart, table, filter]) => downloadJson(chart, table, filter))
下载按钮点击$.pipe(
组合chartData$、tableData$和filterData$//下载JSON(图表、表格、过滤器))
但是,当这3个可观测值中的任何一个作为页面生命周期的一部分发出值时,只需单击下载,就不应该调用
downloadJson
函数

TLDR

工作最优雅的解决方案(如Mike所建议)

一旦所有可见光发射,测试将发射。您可以使用switchMap从downloadButtonClicked$切换

downloadButtonClicked$.pipe(
   switchMap(
     () => combineLatest([chartData$, tableData$, filterData$])
   )
).subscribe(([chart, table, filter]) => downloadJson(chart, table, filter));

如果您想在每个源可观测对象完成之前从它们中获取最后一个值,那么可以使用
forkJoin()
,它将在所有源可观测对象完成后仅发出一次

如果要在每个可观测源的每个发射上发射,可以使用
combinelateest

编辑:

您可以使用
shareReplay(1)
链接每个可观察的源,这样当您订阅它们时,您将获得最新的值

const chartDataShared$ = chartData$.pipe(shareReplay(1));
tableDataShared$ = ...;
filterDataShared$ = ...;

combineLatest([chartDataShared$, tableDataShared, filterDataShared$]).pipe(
  take(1)
);

通过这种方式,您将获得其中每一个发出的最新值。但是,这意味着在代码的其他部分,您需要使用例如
chartDataShared$
而不是
chartData$

,您可以这样做:

CombineTest([chartData$、tableData$、filterData$])。管道(
switchMap(结果=>downloadButtonClicked$.pipe(映射(()=>result)))
).订阅(([图表、表格、筛选器])=>{
下载JSON(图表、表格、过滤器);
});
每当
chartData$
tableData$
filterData$
发出新值时,它将创建一个新的内部订阅,以传递新数据

注意:在所有
chartData$
tableData$
filterData$
发出其第一个值之前,不会创建订阅。如果在这种情况下仍需要下载以触发,则可以使用
defaultIfEmpty

您只需使用即可

下载按钮点击$.pipe(
withLatestFrom(chartData$、tableData$、filterData$)
).subscribe(([\ux,图表,表格,筛选器])=>下载JSON(图表,表格,筛选器))

只有当单击了$的下载按钮发出并将其值与图表数据$、
表格数据$
过滤器数据$
中的最新值相结合时,可观察对象才会发出。有点像每个可观察对象的“当前状态”。好吧,那么问题出在哪里?不是在它们完成时。并不是每一次排放都是如此。仅在单击按钮时。请参阅更新。但是,它需要更改您的代码。谢谢。但“下载”按钮不应一次性使用。用户应该点击并下载任意次数的内容。当其他操作触发输入观察值时,这也会调用downloadJson。但我只希望在单击“下载”时调用它。