2017-01-12 10 views
1

rxjsのドキュメント(http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan)でメソッドスキャンを読むことができます。シードの引数があります。スキャンでデフォルト値を返すObservable

以下のコードでは、_channels Observablesのデフォルト値を返したいと思います。

export interface IChannelOperation extends Function { 
    (channems: Channel[]): Channel[]; 
} 
let initialChannel: Channel[] = []; 

@Injectable() 
export class ChannelsCatalog{ 
    defaultChannel: Subject<Channel> = new BehaviorSubject<Channel>(null); 

    private _currentChannel: Subject<Channel> = new BehaviorSubject<Channel>(null); 
    private _channels: Observable<Channel[]>; 

    private _updates: Subject<any> = new Subject<any>(); 

    constructor(){ 
     this._channels = this._updates 
      .scan((channels: Channel[], operation: IChannelOperation) => operation(channels), initialChannel) 
      .publishReplay(1) 
      .refCount(); 
    } 

    getAllChannelsCatalog(): Observable<Channel[]>{ 
     return this._channels; 
    } 
} 

しかし、私は、観察の元に加入したときに、シード引数が返されません。

var channelsCatalog = new ChannelsCatolog(); 
channelsCatalog.getAllChannelsCatalog.subscribe((value) => console.log(value)); 
+1

「startWith()」を参考にしてみてください。 – olsn

答えて

2

.scanのシード値をアキュムレータとして第一の発光のために使用されています。放出が行われていない場合、スキャン演算子は実行されません。

.startWith演算子の後に接尾辞を付けると、購読時にストリームを直接startWithに渡すことができます。

this._channels = this._updates 
    .scan((channels: Channel[], operation: IChannelOperation) => operation(channels), initialChannel) 
    .startWith(initialChannel) 
    .publishReplay(1) 
    .refCount(); 

あなたはまだそう.scanが実行され、それが第1の値の戻りになる前に、それは2つの排出量を取る.startWithからinitialChannel放射後.scanのシードを必要としています。

関連する問題