【问题标题】:Emitting a hot boolean observable using switchMap?使用 switchMap 发出一个热布尔可观察对象?
【发布时间】:2019-02-24 03:55:00
【问题描述】:

尝试创建一个isEmpty:Observable<boolean> 方法,该方法使用switchMap 发出一个热Observable<boolean>。这是我目前所拥有的:

  /**
   * 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] '(entries: E[]) => boolean' 类型的参数不能分配给 '(value: E[], index: number) => ObservableInput' 类型的参数。 类型 'boolean' 不可分配给类型 'ObservableInput'。 (参数)条目:E[]

想法?

【问题讨论】:

    标签: javascript angular typescript rxjs switchmap


    【解决方案1】:

    switchMap 运算符用于在每个值上选择一个新的 observable。您只需要一个常规的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)
      );
    }
    

    【讨论】:

    • 谢谢这更有意义:)。我现在遇到另一个错误:[ts] 'OperatorFunction' 类型的参数不可分配给'OperatorFunction 类型的参数E[],布尔值>'。输入'布尔| E[]' 不能分配给类型 'E[]'。类型“false”不可分配给类型“E[]”。有什么想法吗?
    • 是的,你会想改用startWith(values(this.entries))。这样map 总是映射E[] 项目。目前,您从布尔值开始,这就是为什么使用 boolean | E[] 而不是 E[]
    • 好酷!我结束了 startWith,因为entries 在启动时默认长度为零。再次感谢!
    • 切片商店现在有可观察的计数和空通知:npmjs.com/package/@fireflysemantics/slice
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多