使用switchMap发出可观察到的布尔热值?

时间:2018-09-19 22:18:44

标签: javascript angular typescript rxjs switchmap

尝试创建一种isEmpty:Observable<boolean>方法,该方法使用Observable<boolean>发出热的switchMap。这是我到目前为止的内容:

  /**
   * Notifies observers when the store is empty.
   */
  protected notifyOnEmpty = new ReplaySubject<E[]>(1);

  /**
   * Check whether the store is empty.
   * 
   * @return A hot {@link Observable<boolean>} that indicates whether the store is empty.
   * 
   * @example
     <pre>
    source.isEmpty();
    </pre>
  */
  isEmpty<E>():Observable<boolean> {
    const isCurrentlyEmpty = values(this.entries).length == 0;
    return this.notifyOnEmpty.pipe(startWith(isCurrentlyEmpty), 
                                   switchMap((entries:E[])=>entries.length == 0));
  }

这种想法是商店可以随后致电notifyOnEmpty.next(Object.values(this.entries))来让订户知道商店是否空了。

无论如何,switchMap语句都会导致错误:

  

[ts]   类型'(entry:E [])=> boolean'的参数不能分配给类型'(value:E [],index:number)=> ObservableInput'的参数。     不能将类型“ boolean”分配给类型“ ObservableInput”。   (参数)条目:E []

有想法吗?

1 个答案:

答案 0 :(得分:1)

switchMap运算符用于在每个值上选择一个新的可观察值。您只需要一个常规的map即可将每个Array映射到一个boolean

import { map, startWith } from 'rxjs/operators';

// ...

isEmpty<E>():Observable<boolean> {
  return this.notifyOnEmpty.pipe(
    startWith(values(this.entries)), 
    map((entries:E[]) => entries.length == 0)
  );
}