Излучение горячего логического значения, наблюдаемого с помощью 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' нельзя назначить параметру типа '(значение: E[], index: number) => ObservableInput'. Тип "логический" нельзя назначить типу "ObservableInput". (параметр) записи: E []

Мысли?

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)
  );
}
Другие вопросы по тегам