2016-09-25 179 views
1

我试图得到反应式编程的基础知识更扎实的理解,所以我打算通过这里的例子: http://reactivex.io/rxjs/manual/tutorial.html#creating-observables为什么没有这个简单的例子rxjs像预期的那样

我只是在文本编辑器中键入它们并通过节点在终端中运行它们。第一个例子没有输出(第二个例子工作,所以它不是加载库的问题)。我期待它输出'foo',但我什么也没得到。为什么?

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

回答

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实施next简单地调用转发到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

+0

感谢所有的细节,我真的很感谢 - 这是非常有帮助的。 –

相关问题