为什么这个简单的rxjs示例没有按预期运行

时间:2016-09-25 02:55:44

标签: javascript node.js reactive-programming rxjs

我试图更深入地了解反应式编程的基础知识,所以我将通过这里的示例: http://reactivex.io/rxjs/manual/tutorial.html#creating-observables

我只是在文本编辑器中输入它们并通过节点在终端中运行它们。第一个示例不生成输出(第二个示例有效,因此加载库不是问题)。我期待它输出'foo',但我一无所获。为什么呢?

var myObservable = Rx.Subject.create();
myObservable.subscribe(value => console.log(value));
myObservable.next('foo');

1 个答案:

答案 0 :(得分:2)

在没有参数的情况下调用Rx.Subject.create()会创建一个没有AnonymousSubject观察者的destination

export class Subject<T> extends Observable<T> implements ISubscription {

  ...

  static create: Function = <T>(destination: Observer<T>, source: Observable<T>): AnonymousSubject<T> => {
    return new AnonymousSubject<T>(destination, source);
  };

  ...
}

AnonymousSubject的{​​{1}}实施只是将调用转发给destination观察者,如果没有,则无效:

export class AnonymousSubject<T> extends Subject<T> {

  constructor(protected destination?: Observer<T>, source?: Observable<T>) {
    super();
    this.source = source;
  }

  next(value: T) {
    const { destination } = this;
    if (destination && destination.next) {
      destination.next(value);
    }
  }

  ...
}

所以你问题中的例子什么也没做。这可能是本教程中的一个简单错误,因为以下内容会显示foo已登录到控制台:

var myObservable = new Rx.Subject();
myObservable.subscribe(value => console.log(value));
myObservable.next('foo');

请注意,上面的代码会创建Subject,而不是AnonymousSubject