为什么我的 Observable 只向最近的订阅者发送消息
Why is my Observable only sending a message to the most recent subscriber
我有 2 个 Angular (1.6.4) 组件和一个服务。该服务像这样创建 2 个可观察对象 (coffeescript)...
// In service constructor
@observable = Rx.Observable.create (source) =>
source.next(123)
@observable2 = Rx.Observable.create (source) =>
@observer = source
$timeout =>
@observer.next(345)
, 1000
在我的控制器中有这些行
//Component 1
service.observable.subscribe (v) => console.log('consumer A1: ' + v)
service.observable2.subscribe (v) => console.log('consumer A2: ' + v)
//Component 2
service.observable.subscribe (v) => console.log('consumer B1: ' + v)
service.observable2.subscribe (v) => console.log('consumer B2: ' + v)
我希望看到 4 个控制台日志,但我看到的是 3 个(A1、B1、B2)。为什么当我从外面打电话时只有最后一个订阅被调用但是当它在里面时两个都被调用?有没有办法让第二个示例调用两者(最好是作为 Observable 而不是 Subject)?
如果我确实使用 Subject,一切都会按预期工作,但我仍然很好奇为什么它不能像我对 observable 所期望的那样工作。
每次订阅时,您的 observable2 都会获取订阅者并将其存储在变量 (@observer
) 中。所以第二个订阅 (B2
) 正在替换变量中的值。
很难说重写第二个观察者的正确方法应该是什么,因为你的目标是什么还不清楚。主题当然可以工作。 Observable.timer
也可能有效,具体取决于您的目标。
Observable.timer 方法是:
@observable2 = Observable.timer(1000);
任何订阅它的东西都会在订阅后 1 秒收到一个事件。
我有 2 个 Angular (1.6.4) 组件和一个服务。该服务像这样创建 2 个可观察对象 (coffeescript)...
// In service constructor
@observable = Rx.Observable.create (source) =>
source.next(123)
@observable2 = Rx.Observable.create (source) =>
@observer = source
$timeout =>
@observer.next(345)
, 1000
在我的控制器中有这些行
//Component 1
service.observable.subscribe (v) => console.log('consumer A1: ' + v)
service.observable2.subscribe (v) => console.log('consumer A2: ' + v)
//Component 2
service.observable.subscribe (v) => console.log('consumer B1: ' + v)
service.observable2.subscribe (v) => console.log('consumer B2: ' + v)
我希望看到 4 个控制台日志,但我看到的是 3 个(A1、B1、B2)。为什么当我从外面打电话时只有最后一个订阅被调用但是当它在里面时两个都被调用?有没有办法让第二个示例调用两者(最好是作为 Observable 而不是 Subject)?
如果我确实使用 Subject,一切都会按预期工作,但我仍然很好奇为什么它不能像我对 observable 所期望的那样工作。
每次订阅时,您的 observable2 都会获取订阅者并将其存储在变量 (@observer
) 中。所以第二个订阅 (B2
) 正在替换变量中的值。
很难说重写第二个观察者的正确方法应该是什么,因为你的目标是什么还不清楚。主题当然可以工作。 Observable.timer
也可能有效,具体取决于您的目标。
Observable.timer 方法是:
@observable2 = Observable.timer(1000);
任何订阅它的东西都会在订阅后 1 秒收到一个事件。