在RxJS 5中,是否有一种在订阅它之前触发Observable的方法?

Dav*_*ave 3 rxjs5

我知道RxJS 5(和其他地方)中的可观察对象是懒惰地执行的。换句话说,直到有订阅者,它们才被执行。但是,我正在尝试预取一些数据。有没有一种方法可以在订阅之前触发可观察对象?

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);
});
Run Code Online (Sandbox Code Playgroud)

Tam*_*dus 5

您想使感冒变热。(什么是冷热观测

因此,如果您已经观察到寒冷,则可以将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);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.1/Rx.js"></script>
Run Code Online (Sandbox Code Playgroud)

但是通常有一种更简单的方法。我假设您有一个外部事件源,您希望将其转换为可观察的事件。正确的方法是使用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);
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.0-rc.1/Rx.js"></script>
Run Code Online (Sandbox Code Playgroud)