【问题标题】:In RxJS 5, is there a way to trigger an Observable before subscribing to it?在 RxJS 5 中,有没有办法在订阅 Observable 之前触发它?
【发布时间】:2016-10-14 21:51:15
【问题描述】:

我知道 RxJS 5(和其他地方)中的 observable 是延迟执行的。换句话说,它们在有订阅者之前不会被执行。但是,我正在尝试预取一些数据。有没有办法在订阅之前触发 observable?

let obs = Rx.Observable.create(observer => {
  console.log('Observer executed');
  // This would actually be fetching data from a server:
  observer.next(42);
});

// Something like obs.warmup() happens here
console.log('Observer is ideally called before this point.');

// Some time later this is called, and hopefully the data is already retrieved.
obs.subscribe(value => {
  console.log('Got ' + value);
});

【问题讨论】:

    标签: rxjs5


    【解决方案1】:

    你想让一个冷的 observable 变热。 (what are hot and cold observables)

    因此,如果您已经有一个冷 observable,您可以将 publish 运算符与 connect 一起使用。

    let obs = Rx.Observable.create(observer => {
      console.log('Observer executed');
      // This would actually be fetching data from a server:
      observer.next(42);
    }).publish(); // create a ConnectableObservable
    
    obs.connect(); // Run the observer
    
    // Something like obs.warmup() happens here
    console.log('Observer is ideally called before this point.');
    
    // Some time later this is called, and hopefully the data is already retrieved.
    obs.subscribe(value => {
      console.log('Got ' + value);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.1/Rx.js"></script>

    但通常有一个更简单的方法。我假设您有一个外部事件源,您想将其转换为可观察的。正确的方法是使用Subject。

    let obs = new Rx.Subject();
    
    console.log('Observer executed');
    obs.next(42); // subscribers would receive this... 
    // it could be something like `service.on("event", e => obs.next(e));`
    
    // Something like obs.warmup() happens here
    console.log('Observer is ideally called before this point.');
    
    // Some time later this is called, and hopefully the data is already retrieved.
    obs.subscribe(value => {
      console.log('Got ' + value);
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.1/Rx.js"></script>

    【讨论】:

    • 谢谢。我想它并没有默认主题是热门的。使这项工作正常工作的一个小改动是改用 ReplaySubject。否则“42”永远不会出现。
    猜你喜欢
    • 2021-12-29
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 2021-07-26
    • 2020-06-11
    • 2016-12-20
    相关资源
    最近更新 更多