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

Observable instance emit without an observer (or subscriber ?)

本文关键字:情况下 实例 对象 观察 观察者      更新时间:2023-09-26

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

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

我怎么能在不知道对应观察者的情况下发出值,因为我想在create函数之外发出值。一个可能的解决方案是保存观察者到一些全局变量,但我认为一个可观察对象应该是足够的。对此有什么建议吗?

你把很多东西混在一起了。可观察对象与观察者不是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

阅读更多:

  • http://reactivex.io/intro.html
  • <
  • https://github.com/Reactive-Extensions/RxJS资源/gh>
  • https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md

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

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

相关文章: