Javascript 使一个只执行源一次的懒惰的、缓存的可观察对象

Javascript 使一个只执行源一次的懒惰的、缓存的可观察对象,javascript,rxjs,rxjs5,Javascript,Rxjs,Rxjs5,我试图使用rxjs observable在应用程序的整个生命周期中委托但共享一项昂贵的工作 本质上,类似于: var work$ = Observable.create((o) => { const expensive = doSomethingExpensive(); o.next(expensive); observer.complete(); }) .publishReplay(1) .refCount(); 现在,这很好,完全符合我的要求,除了一件事:如果所有订阅者都

我试图使用rxjs observable在应用程序的整个生命周期中委托但共享一项昂贵的工作

本质上,类似于:

var work$ = Observable.create((o) => {
  const expensive = doSomethingExpensive();
  o.next(expensive);
  observer.complete();
})
.publishReplay(1)
.refCount();
现在,这很好,完全符合我的要求,除了一件事:如果所有订阅者都退订,那么当下一个订阅者订阅时,我昂贵的工作又发生了。我想保留它

现在,我可以使用一个主题,或者删除refCount()并手动使用connect(并且永远不要断开连接)。但这将使昂贵的工作发生在我连接的那一刻,而不是订户第一次尝试使用work$

本质上,我想要类似于refCount的东西,它只查看要连接的第一个订阅,而从不断开连接。“懒散的连接”

这样的事情有可能吗?

实际上是怎么回事 它在内部创建多播,并使其兼容。
ReplaySubject
的最小replay值为1。其结果如下:

  • 第一次订阅将触发
    publishReplay(1)
    在内部订阅源流,并通过
    ReplaySubject
    传输所有排放,有效缓存最后n(=1)个排放
  • 如果在源仍处于活动状态时启动第二个订阅,
    多播()
    将把我们连接到同一个
    replaySubject
    ,我们将接收所有下一个发射,直到源流完成
  • 如果订阅是在源已经完成之后启动的,则replaySubject缓存了最后n次排放,并且它将仅在完成之前接收这些排放
const source=Rx.Observable.from([1,2])
.mergeMap(i=>Rx.Observable.of('发射:'+i).延迟(i*100))
.do(null,null,()=>console.log('sourcestreamcompleted'))
.publishReplay(1)
.refCount();
//在流完成之前及时完成的两个订阅
subscribe(val=>console.log(`sub1:${val}`),null,()=>console.log('sub1 completed');
subscribe(val=>console.log(`sub2:${val}`),null,()=>console.log('sub2 completed');
//流已完成后的新订阅
设置超时(()=>{
subscribe(val=>console.log(`sub_late-to-the-party:${val}`),null,()=>console.log(`sub_late-to-party completed');
}, 500);

简单地将创建为startWith(),然后将映射操作链接到它(使用identity函数)并让使用者订阅映射的可观察输出而不是实际的源是否有效?这至少是有文档记录的行为。这有点脏,但也许你可以添加一个订阅者,基本上让可观察的保持1个或更多的refcount,这样它就不会刷新缓存的工作。我浏览了API,但找不到其他方法在没有订阅者的情况下保持缓存。因此,我更多地使用了它,这并没有达到我预期的效果(但它达到了我想要的效果!)。我不太明白。我希望每次订阅者点击0时,从源数据中再次发生refCount和publishReplay操作(并创建一个新的可连接的可观察对象)。但这并没有发生。