angular - RXJS sharedReplay 在重新创建 observable 时不起作用
问题描述
我正在为我的应用程序使用 RXJS websocket。登录后,数据从我的服务器发送到客户端,并且数据存储在可观察对象中shareReplay
,用于在导航应用程序时保留数据。
if(!this.data$ || this.data$Completed) {
this.data$ = this.dataService.get(this.CTRL, 'list').pipe(
finalize(() => {
console.log('finalizing data list');
this.data$Completed = true;
}),
map(data => [....]), // irrelevant
tap((d) => console.log('data: ', d)),
shareReplay(1),
tap((d) => console.log('data 2: ', d)),
);
}
控制台输出符合预期
// first subscribe
data: [{…}]
data 2: [{…}]
// every other subscribe when resubscribing after navigation / different components
data 2: [{…}]
data 2: [{…}]
data 2: [{…}]
...
注销时连接终止并finalize
触发该方法。重新登录时再次发送数据,但shareReplay
不再起作用。我只在第一次订阅时获得数据,但在导航和重新订阅后没有。
// logout
finalizing data list
// logging in again
data: [{…}]
data 2: [{…}]
我还注意到,multiplex
在这种情况下,rxjs websocket 将订阅命令发送到服务器,所以很明显我订阅了 websocket 主题而不是 ReplaySubject。
解决方案
当finalize
被调用时,这意味着源Observable
已经完成。您无法重新启动已完成的Observable
. 仍然在data$
订阅时发出,因为这是 的想法shareReplay
,它只是为您提供订阅时最后发出的值,无论源是否完成。但是,它永远不会获得新数据。
当你再次登录时,你必须重新创建你的data$
observable,以获得一个新的 observable。
推荐阅读
- swift - 从 UICollectionView 将图像名称打印到控制台
- python-3.x - 找出列表中所有值的最近值
- c# - 在泛型函数中使用集合
- android - Android:Espresso:点击是阻止用户界面,无法进行下一次检查
- excel - 下面的vba代码行不适用于删除excel工作簿中的工作表在excel 365中不起作用
- php - woocommerce_order_status_changed 在订单详细信息中不起作用
- hibernate - Hibernate + jcache + ehcache 集成不工作
- gitlab - gitlab CI/CD 在外部服务器上运行命令
- mongodb - 如何关闭 mongodb 空闲连接(活动:false)?
- python - 当我尝试在 Python 3 中安装“v4l2capture”包时收到一条致命错误消息