Observable 实例在没有观察者(或订阅者?)

dtt*_*412 4 javascript observable rxjs rxjs5 angular

我在 Angular2 中使用 observable。据我所知,每个 Observable 实例都带有一个观察者(1:1),当我们用观察者.next(值)发出一些东西时,我们可以用 observable.subscribe((值)=> {})获得该值。

var observable = Observable.create(observer => {
  observer.next(value);
}
.map(value=>{})
.catch(...)
observable.subscribe(value => {
  console.log(value);
})
Run Code Online (Sandbox Code Playgroud)

如何在不知道相应观察者的情况下发出值,因为我想在 create 函数之外发出值。一种可能的解决方案是将观察者保存到某个全局变量中,但我认为一个 observable 就足够了。对此有何建议?

mar*_*tin 6

你将多种东西混合在一起。Observables 与 Observers 不是 1:1 的关系(更准确地说是 1:N)。如果您希望能够手动发出值,您需要Subject同时充当 Observable 和 Observer 的 。实际上,这意味着你可以调用它的next()方法,它会将值传播给它的所有订阅者(观察者)。

例如,考虑 TypeScript 中的以下代码:

import {Subject} from 'rxjs';

let source = new Subject();

source.subscribe(val => console.log('Observer 1:', val));
source.subscribe(val => console.log('Observer 2:', val));

source.next(42);
source.next('test');
Run Code Online (Sandbox Code Playgroud)

这将打印到控制台:

Observer 1: 42
Observer 2: 42
Observer 1: test
Observer 2: test
Run Code Online (Sandbox Code Playgroud)

观看现场演示:http : //plnkr.co/edit/gWMFMnPlLJVDC1pQi8pH?p=preview

阅读更多:

请注意,这Observable.create()是一种非常不同的动物。它接受一个函数作为参数,每次新的观察者订阅时都会调用该函数。这就是为什么它将新订阅的 Observer 作为参数。例如,在此函数中,您可以调用next()Observer 上的方法以向其发送所有订阅需要接收的一些默认值。

所以你可能想使用Subject而不是Observable.create().