如何在不创建新的实例的情况下管好一个观测值。

比如说,我有一个主题,在一个可分页的表格中表示页面。

pageCount$

然后,我把它放入一个新的变量中,这个变量通过API来获取表格的数据。

const tableData$ = pageCount$.pipe(switchMap(pageCount => getTableData(pageCount)));

这很好用,每次我发送一个新的页面时 tableData$ 发出该页面的数据。

现在问题来了,我想解决这个问题。

在我的页面上,我也希望使用该表数据来显示它当前所包含的平均数。所以我想我可以直接用管道 tableData$ 通过一个执行这些平均值的映射。

const averageData$ = tableData$.pipe(map(data => performAverages(data)));

这样做是可行的,但是因为每次我订阅每个变量都会创建一个新的实例,所以我的API调用发生了两次。一次是对 tableData$ 订阅和一次 averageData$ 订阅。不过我知道这种行为是设计出来的。

我感觉我想使用某种tapfork操作符,但我认为这种操作符并不存在。

有没有可能在执行这些任务的同时只调用一次api?

谢谢你

解决方案:

你可以使用 share 操作符来实现这一目的。

首先创建调用API的观测值,并用 share

https:/www.learnrxjs.iolearn-rxjsoperatorsmulticastingshare.

然后,所产生的观测值可以被订阅两次,两次订阅都会收到相同的结果,而不需要共享观测值被调用两次(’多播’)。

这应该会给你一些类似于.NET的东西。

const tableData$ = pageCount$.pipe(
    switchMap(pageCount => getTableData(pageCount)),
    tap(_ => console.log('API called')),
    share()
);

// subscribe to tabledata$ twice

tableData$.subscribe(_ => console.log('get and use data once'));
tableData$.subscribe(_ => console.log('get and use data a second time'));

(有待测试,欢迎反馈!)

给TA打赏
共{{data.count}}人
人已打赏
未分类

防止Shiny selectInput在更新反应式绘图时过早地评估。

2022-9-8 20:21:40

未分类

在spark scala中查找数组列中的元素的最好方法是什么?

2022-9-8 20:21:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索