让Subject在订阅时发出一个值

时间:2017-08-12 20:07:10

标签: javascript rxjs reactive-programming

如何让主题在订阅时发出一个值?

let mySubject = new Subject<string>
// specify somehow that when you subscribe to mySubject, it emits 'foo'

mySubject.subscribe(value => {
  // get 'foo' here
});

3 个答案:

答案 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次。

但是,我没有弄清楚任何用例。因此,您可以向我们提供更多信息。