【问题标题】:RxJs - Multiple subscribers waiting on the same result of a promiseRxJs - 多个订阅者等待相同的承诺结果
【发布时间】:2017-02-02 22:07:14
【问题描述】:

如果同一个承诺已经在进行中,而后来者已经给出了新的解决方案,我如何让多个订阅者等待解决?

doSomething = () => {
  return new Promise((resolve) => {
     setTimeout(() => resolve(Math.random(), 1000)
  })
}

// how to define obs?

obs.subscribe(v => console.log(v)); // 0.39458743297857473
obs.subscribe(v => console.log(v)); // 0.39458743297857473
obs.subscribe(v => console.log(v)); // 0.39458743297857473

setTimeout(() => obs.subscribe(v => console.log(v)), 2000); // 0.9485769395265746

我希望 observable 在第一个订阅者之前保持冷态,然后在结果流式传输到所有后续并发订阅者后再次冷态。我基本上不希望对同一个底层函数有任何并发​​请求。

【问题讨论】:

    标签: rxjs reactive-programming rxjs5


    【解决方案1】:

    您可以使用defer 作为创建操作符,然后使用share 流:

    doSomething = () => {
      return new Promise((resolve) => {
         setTimeout(() => resolve(Math.random(), 1000));
      });
    }
    
    const obs = Rx.Observable
        .defer(doSomething)
        .share();
    
    obs.subscribe(console.log); // resolve #1
    obs.subscribe(console.log); // resolve #1
    obs.subscribe(console.log); // resolve #1
    
    setTimeout(() => obs.subscribe(console.log), 2000); // resolve #2
    
    <script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>
    

    【讨论】:

    • 这适用于我给出的示例,所以我接受了。非常感谢您的帮助。我实际上早先尝试过,但它不适用于我的实际用例,而不是我为简化事情而给出的示例。我现在明白为什么它不起作用了,它不是可重入的。在使用 obs 的管道的末尾,有一个订阅的库代码,在它的 onNext 块中,它正在生成一个动作……drumroll……依赖于 obs 并因此陷入僵局。我不知道我怎么总是以这些该死的可怕边缘案例告终! :-)
    猜你喜欢
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2017-03-28
    • 2019-09-15
    • 2021-11-16
    • 1970-01-01
    相关资源
    最近更新 更多