关于rxjs:使用scan Observable返回默认值

Return a default value with scan Observable

我可以阅读rxjs文档(http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan)中有关方法扫描的观点。

在下面的代码中,我想返回_channels Observables的默认值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
export interface IChannelOperation extends Function {
    (channels: 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 = new Subject();

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

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

但是,当我订阅可观察的ex时,seed参数不会返回:

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


种子值.scan用于第一次发射作为累加器。 如果未完成任何排放,则扫描操作员将不会执行。

您正在寻找.startWith运算符,该运算符可以在您的扫描运算符后加后缀,以使您的流在订阅时直接发出传递给startWith的值。

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

您仍然需要.scan的种子,否则从.startWith发出initialChannel发射之后,将执行两次发射,然后执行.scan并返回它的第一个值。