不退订的共享运营商

Sam*_*mmi 4 rxjs

我需要延迟加载一些无限流,因为它们启动起来很昂贵。而且我也不想在它们出于同样的原因启动后停止它们。

我认为如果有一个共享操作符在第一次订阅时没有取消订阅底层流,即使所有下游订阅者都取消订阅,那会很好。

现在我在两条不同的线路上使用发布和连接来完成它,它工作正常,但看起来很笨重而且不是很 rxjs,例如:

public data$(): Observable<any> {
    if (this.lazyData$) {
        return this.lazyData$;
    }

    this.lazyData$ = this.someDataProvider.data$()
    .publishReplay(1);

    this.lazyData$.connect();

    return this.lazyData$;
}
Run Code Online (Sandbox Code Playgroud)

此外,我希望它向新订阅者重播最后一条消息,如您所见:)

car*_*ant 5

shareReplay运算符是在 RxJS版本 5.4.0 中添加的。并且,在5.5.0 版本中修复了一个错误,以便在订阅者数量降至零时保留其历史记录。

修复后,shareReplay将影响您正在寻找的行为,因为它现在仅在源完成或出错时才取消订阅源。当共享 observable 的订阅者数量降为零时,共享 observable 将保持订阅源。


的行为shareReplay已多次更改,更改摘要 - 及其原因 - 可以在此博客文章中找到。