gpt4 book ai didi

javascript - 如何创建一个仅在有订阅者时触发的 Observable,并立即为新订阅者提供最新值

转载 作者:行者123 更新时间:2023-12-04 09:44:46 26 4
gpt4 key购买 nike

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

  • 仅在有订阅者时输出事件
  • 为任何新订阅者提供最新值。

  • 具体情况是,我需要一个可观察的对象,它在特定事件发生时进行异步 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

    这有效。如果我 console.log(...)SomeAPI.someDataGet方法,我只看到它在流有订阅者时触发。而且我的实现看起来非常好,因为我这样做是为了订阅和取消订阅,这非常适合 React 组件生命周期方法。
    let sub1;
    sub1 = dataStream.subscribe(x => console.log('sub1', x));
    sub1.dispose();

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

    setTimeout( () => {
    sub2 = dataStream.subscribe(x => console.log('sub2', x));
    }, 1500)

    ...我没有看到 console.log对于 sub2直到下一个间隔。

    如果我的理解是正确的。我需要一个 Hot Observable .所以我试图创建一个这样的流......
    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一个 hot observable .

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

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

    最佳答案

    而不是 .publish() , 使用 .shareReplay(1) .

    关于javascript - 如何创建一个仅在有订阅者时触发的 Observable,并立即为新订阅者提供最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32759128/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com