尝试创建一种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 []
有想法吗?
答案 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)
);
}