可观察的实例在没有观察者(或订阅者?)的情况下发出

时间:2016-10-21 04:49:54

标签: javascript angular rxjs observable rxjs5

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

change options

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

1 个答案:

答案 0 :(得分:3)

你将多个东西混合在一起。观察者与观察者的关系不是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');

这将打印到控制台:

Observer 1: 42
Observer 2: 42
Observer 1: test
Observer 2: test

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

了解更多:

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

因此,您可能希望使用Subject代替Observable.create()