首页 > 解决方案 > 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。

标签: angularwebsocketrxjs

解决方案


finalize被调用时,这意味着源Observable已经完成。您无法重新启动已完成的Observable. 仍然在data$订阅时发出,因为这是 的想法shareReplay,它只是为您提供订阅时最后发出的值,无论源是否完成。但是,它永远不会获得新数据。

当你再次登录时,你必须重新创建你的data$observable,以获得一个新的 observable。


推荐阅读