Излучение горячего логического значения, наблюдаемого с помощью 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)
);
}