我有多个可观察对象在页面的生命周期内发出值。例如:
chartData$: Observable;
tableData$: Observable;
filterData$: Observable;
用户可以随时单击“下载”按钮,并获取结合了这些可观察量中的每一个最后发出的值的 JSON:
downloadButtonClicked$.pipe(
combine chartData$, tableData$ and filterData$ // <- how do I get latest values here?
).subscribe(([chart, table, filter]) => downloadJson(chart, table, filter))
但是当这 3 个可观察对象中的任何一个作为页面生命周期的一部分发出值时,不应调用 downloadJson
函数,仅在下载点击时调用。
TLDR;
工作最优雅的解决方案(由迈克建议) https://stackblitz.com/edit/typescript-jm3zma?file=index.ts
最佳答案
你可以这样做:
combineLatest([chartData$, tableData$, filterData$]).pipe(
switchMap(result => downloadButtonClicked$.pipe(map(() => result)))
).subscribe(([chart, table, filter]) => {
downloadJson(chart, table, filter);
});
每当 chartData$
、tableData$
或 filterData$
发出新值时,它都会创建一个新的内部订阅 downloadButtonClicked $
向下传递新数据。
注意:在所有 chartData$
、tableData$
和 filterData$
发出它们的第一个值之前,不会创建订阅。如果您需要下载在这种情况下仍然触发,那么您可以使用 defaultIfEmpty
。
关于Rxjs:在发射后从多个可观察量中获取最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63795528/