Angular 受试者订阅可观测数据

Angular 受试者订阅可观测数据,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我有以下简单的代码: let a: Observable<any> = Observable.from([1,2,3,4,5]).share(); let b: Subject<any> = new Subject(); a.subscribe(b) a.subscribe(value => console.log("New observable value: " + value)); b.subscribe(value => console.log("Ne

我有以下简单的代码:

let a: Observable<any> = Observable.from([1,2,3,4,5]).share();
let b: Subject<any> = new Subject();

a.subscribe(b)
a.subscribe(value => console.log("New observable value: " + value));
b.subscribe(value => console.log("New subject value: " + value));

b.next("value1");
b.next("value2");
a:Observable=Observable.from([1,2,3,4,5]).share();
设b:Subject=newsubject();
a、 订阅(b)
a、 订阅(value=>console.log(“新的可观察值:”+value));
b、 订阅(value=>console.log(“新主题值:”+value));
b、 下一步(“价值1”);
b、 下一步(“价值2”);
我看到的唯一控制台行是那些对数组中的每个值都具有“新的可观察值:”的行。如果我注释掉第3行,那么我会得到所有“新的可观察值”行和“新的主体值”行,但是主体当然不会得到任何被可观察值(数组的一部分)忽略的值

那么最基本的问题是——为什么会这样?为什么我的主题看不到任何数组元素1,2,3,4,5?它订阅了可观察对象,因此它应该获得这些事件(
share()
应该向所有订阅者广播),但这似乎是我的误解


我在这里寻找的是对主题进行一次订阅,并查看从observable传入的所有值加上通过调用
next()
发出的任何值。是我的代码错了,还是我试图以错误的方式做事?

这是主题及其内部状态的典型问题

当您调用
a.subscribe(b)
时,受试者会收到来自源可观察
a
的所有项目,以及标记为已停止的
complete
通知。您可以在源代码中看到它:
然后忽略所有其他信号,正如您在此处看到的:

这意味着此主题实例将不再发射任何东西。永远都是这样。您可以看到,
complete
信号实际上是通过
do()
运算符发送的:

a.do(val => console.log('do: ' + val), null, () => console.log('do: complete'))
  .subscribe(b)
请参见演示:

因此,在您的情况下,您希望保护受试者
b
不接收
complete
通知。您可以通过仅手动获取并按下
下一个
信号来执行此操作:

a.subscribe(val => b.next(val));
请参见演示:


另一个与您的问题非常类似的问题:

您的基本问题是您订阅
控制台时的订阅顺序。记录
主题已收到数据。(查看下面的代码示例以查看其运行情况)

第二个问题,为什么
next(“value1”)
不起作用,是因为
a.subscribe(b)
b
上发出
1,2,3,4,5
后也会调用
.complete()

a=Rx.Observable.from([1,2,3,4,5]).share();
设b=新的Rx.Subject();
b、 订阅(value=>console.log(“新主题值:”+value));
a、 订阅(value=>console.log(“新的可观察值:”+value));
a、 认购(b)

我想是投票否决机器人!谢谢你的回答,这为我澄清了一切:-)。到源代码的链接很有用,谢谢。我觉得自己很愚蠢,我一步一步地通过了密码,却错过了眼前的一切!