我如何正确 invoke/manage 后续订阅我的可观察对象?
How do I properly invoke/manage subsequent subscriptions for my observable?
试图创建一个可推送给所有订阅者的可观察对象,但我 运行 遇到了多个订阅的问题。据我了解,订户管理是自动为我处理的。在下面的示例中,我的目标是同时记录 'a' 和 'b'。
let observer = null as any;
let ob$ = new Observable<any>(ob => {
//this piece of code will be called twice, over-writing the original
observer = ob;
});
ob$.do(() => console.log("a")).subscribe();
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called
observer.next();
observer.complete();
问题在于您如何使用 new Observable()
(这等同于使用 Observable.create()
)。
每次您订阅 ob$
时,都会在您覆盖 observer
的地方调用对 new Observable()
的回调。然后,当您调用 observer.next()
时,您仅在第二个 Observer 上调用 next
。
换句话说,"a"
永远不会被打印出来,因为当您订阅 ob$
.[=26 时,您永远不会在 new Observable()
内部创建的 Observer 上调用 next
=]
一般来说,这不是使用 new Observable()
的好方法,而您尝试做的事情更好 Subject
。
let observer = null as any;
let subject = new Subject();
let ob$ = subject.asObservable();
ob$.do(() => console.log("a")).subscribe();
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called
subject.next();
subject.complete();
观看现场演示:http://jsbin.com/hocagar/4/edit?js,console
这会打印:
a
b
试图创建一个可推送给所有订阅者的可观察对象,但我 运行 遇到了多个订阅的问题。据我了解,订户管理是自动为我处理的。在下面的示例中,我的目标是同时记录 'a' 和 'b'。
let observer = null as any;
let ob$ = new Observable<any>(ob => {
//this piece of code will be called twice, over-writing the original
observer = ob;
});
ob$.do(() => console.log("a")).subscribe();
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called
observer.next();
observer.complete();
问题在于您如何使用 new Observable()
(这等同于使用 Observable.create()
)。
每次您订阅 ob$
时,都会在您覆盖 observer
的地方调用对 new Observable()
的回调。然后,当您调用 observer.next()
时,您仅在第二个 Observer 上调用 next
。
换句话说,"a"
永远不会被打印出来,因为当您订阅 ob$
.[=26 时,您永远不会在 new Observable()
内部创建的 Observer 上调用 next
=]
一般来说,这不是使用 new Observable()
的好方法,而您尝试做的事情更好 Subject
。
let observer = null as any;
let subject = new Subject();
let ob$ = subject.asObservable();
ob$.do(() => console.log("a")).subscribe();
ob$.do(() => console.log("b")).subscribe(); //only 'b' is called
subject.next();
subject.complete();
观看现场演示:http://jsbin.com/hocagar/4/edit?js,console
这会打印:
a
b