如何让主题在订阅时发出一个值?
let mySubject = new Subject<string>
// specify somehow that when you subscribe to mySubject, it emits 'foo'
mySubject.subscribe(value => {
// get 'foo' here
});
答案 0 :(得分:0)
您只需使用.next
以下代码应该有效:
const mySubject = new Subject()
mySubject.subscribe(value => {
console.log(value)
});
mySubject.next("foo")
答案 1 :(得分:0)
您不仅可以从Subject
发出流/值,实际上您可以将流/值发送到多个Observers
。这意味着您可以将多个观察者附加到Subject
。每个Subject
都可以包含一个Observer集合。当您订阅该主题时,它将向其集合中的每个观察者发出流/值。
const subject = new Rx.Subject()
// add an observer to the list of observers of the subject
const sub1 = subject.subscribe(function(val){
console.log("observer 1", val);
});
// add another observer to the list of observers of the subject
const sub2 = subject.subscribe(function(val){
console.log("observer 2", val);
});
// notify all observers in the list with "hi there"
subject.next('hi there');
// remove observer1 from the list
sub1.unsubscribe();
不仅如此,您还可以使用Subject作为Observer并将其提供给Observable。这意味着您可以使用Subject将Observable“多播”到多个观察者。
// To "share" the observable tick$ with two observers,
// this way, we can pipe all notifications
// through a Subject, like so
const tick$ = Rx.Observable.interval(1000);
const subject = new Rx.Subject();
subject.subscribe(function(val){
console.log('from observer 1: '+ val);
});
subject.subscribe(function(val){
console.log('from observer 2: '+ val);
});
tick$.subscribe(subject);
为了理解RxJ,您必须了解 Observer Pattern 规定的 “Gang Of Four” 。我建议你尝试理解Observer模式,我希望你能清楚RxJs库在做什么。
reference Learning JavaScript Design Patterns一书Addy Osmani中有另一篇精彩{{3}}。
答案 2 :(得分:0)
我相信你对你想拥有的东西的描述实际上不是你想拥有的......
例如,如果您希望每次有人订阅时您的主题都会发出foo,那么您可以扩展主题。
https://jsfiddle.net/v11rndmt/
class MySubject extends Rx.Subject{
constructor(){ super(); }
subscribe(oOrOnNext, onError, onCompleted){
const subs = super.subscribe(oOrOnNext, onError, onCompleted);
this.next("foo")
return subs;
}
}
let sub = new MySubject()
sub.subscribe(v => console.log(v));
sub.subscribe(v => console.log(v));
sub.subscribe(v => console.log(v));
这会发出3次foo。第一次只有一个订户,所以它会打印一次。第二次有两个,所以它将打印两次。第三个是3,所以它将打印3次。因此,foo将被打印6次。
但是,我没有弄清楚任何用例。因此,您可以向我们提供更多信息。