Javascript 如何创建一个Observable,它只在有订阅者时触发,并立即向新订阅者提供最新的值

Javascript 如何创建一个Observable,它只在有订阅者时触发,并立即向新订阅者提供最新的值,javascript,rxjs,frp,reactive-extensions-js,Javascript,Rxjs,Frp,Reactive Extensions Js,我正在尝试创建一个流/可观察到的 仅在有订阅服务器时输出事件 为所有新订阅服务器提供最新值 具体的情况是,我需要一个observable,它在特定事件发生时进行异步API调用,但前提是它有订阅者。我试图避免不必要的API调用 我已经设法创建了一个流,只有当它有这样的订户时才会触发 let dataStream = Rx.Observable .interval(1000) // Fire an event every second .singleInstance() // Only

我正在尝试创建一个流/可观察到的

  • 仅在有订阅服务器时输出事件
  • 为所有新订阅服务器提供最新值 具体的情况是,我需要一个observable,它在特定事件发生时进行异步API调用,但前提是它有订阅者。我试图避免不必要的API调用

    我已经设法创建了一个流,只有当它有这样的订户时才会触发

    let dataStream = Rx.Observable
       .interval(1000) // Fire an event every second
       .singleInstance() // Only do something when we have subscribers
       .startWith(null) // kick start as soon as something subscribes
       .flatMapLatest(interval => SomeAPI.someDataGet()) // get data, returns a promise
    
    let dataStream = Rx.Observable
       .interval(1000) // Fire an event every second
       .singleInstance() // Only do something when we have subscribers
       .startWith(null) // kick start as soon as something subscribes
       .flatMapLatest(interval => SomeAPI.someDataGet()) // get data
       .publish() // Make this a hot observable;
    
    这是有效的。如果我在
    SomeAPI.someDataGet
    方法中
    console.log(…)
    ,我只看到它在流有订阅者时启动。我的实现看起来非常好,因为我这样做是为了订阅和取消订阅,这非常适合React组件生命周期方法

    let sub1;
    sub1 = dataStream.subscribe(x => console.log('sub1', x));
    sub1.dispose();
    
    我还希望任何新订户在订阅时立即收到最新的价值。这就是我挣扎的地方。如果我这样做

    let sub1, sub2;
    sub1 = dataStream.subscribe(x => console.log('sub1', x));
    
    setTimeout( () => {
        sub2 = dataStream.subscribe(x => console.log('sub2', x));
    }, 1500)
    
    …直到下一个时间间隔,我才看到
    sub2的
    console.log

    如果我的理解是正确的。我需要一张支票。所以我试着创建一个像这样的流

    let dataStream = Rx.Observable
       .interval(1000) // Fire an event every second
       .singleInstance() // Only do something when we have subscribers
       .startWith(null) // kick start as soon as something subscribes
       .flatMapLatest(interval => SomeAPI.someDataGet()) // get data, returns a promise
    
    let dataStream = Rx.Observable
       .interval(1000) // Fire an event every second
       .singleInstance() // Only do something when we have subscribers
       .startWith(null) // kick start as soon as something subscribes
       .flatMapLatest(interval => SomeAPI.someDataGet()) // get data
       .publish() // Make this a hot observable;
    
    据我所知,这应该使
    dataStream
    a
    hot observable

    然而,在我的测试中,第二个订阅直到下一个间隔才接收数据。此外,这将引入在订阅时连接和断开数据流的要求,这是我希望尽可能避免的


    我是RxJS的新手,如果我误解了这里发生的事情,我不会感到惊讶。

    如果你知道怎么做,请使用
    .shareReplay(1)
    而不是
    .publish()
    。谢谢