【问题标题】:Observable instance emit without an observer (or subscriber ?)Observable 实例在没有观察者(或订阅者?)的情况下发出
【发布时间】:2017-03-03 07:00:06
【问题描述】:

我在 Angular2 中使用 observable。据我所知,每个 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 函数之外发出值。一种可能的解决方案是将观察者保存到某个全局变量中,但我认为一个可观察的应该就足够了。对此有什么建议吗??

【问题讨论】:

  • 也许你正在寻找类似Subject的东西?
  • 哦,看来可以使用Subject而不是Observable来完成,非常感谢!!我会花时间进一步研究它。或者我想也许我可以创建一个做我需要的类:)
  • 主题是要走的路。另外注意不是1:1,可以多次订阅
  • 哦,我的错,我以为每次订阅只有一个观察者,但结果是每个订阅都会创建一个不同的观察者。严重的误会>
  • 确实如此。主题是您需要使用的主题。它等效于角度 1 中的 q.defer()。然后在您的函数中返回主题,这等效于 defer.promise。还有 defer.reject = subject.error(), subject.next= defer.resolve

标签: javascript angular rxjs observable rxjs5


【解决方案1】:

您将多种事物混合在一起。 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');

这将打印到控制台:

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

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

阅读更多:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 2018-06-11
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多