【问题标题】:Return a default value with scan Observable使用 scan Observable 返回一个默认值
【发布时间】:2017-01-12 16:16:58
【问题描述】:

我可以阅读 rxjs 文档 (http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan) 中的方法 scan 有一个种子争论。

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

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<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;
   }
}

但是当我订阅可观察的 ex 时,种子参数没有返回:

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

【问题讨论】:

  • 你可能想看看startWith()也许会有所帮助。

标签: rxjs observable


【解决方案1】:

.scan 的种子值作为累加器用于第一次发射。如果没有进行任何排放,则扫描运算符不会执行。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 2017-11-01
    • 2017-03-29
    • 2018-03-05
    • 2021-02-09
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    相关资源
    最近更新 更多