【问题标题】:Triggering side effects when a value is filtered using filter() operator使用 filter() 运算符过滤值时触发副作用
【发布时间】:2019-05-04 21:12:57
【问题描述】:

我正在处理在 debounceTime() 后触发的用户名搜索输入。我还过滤掉了值。如果值被过滤(例如设置错误消息和停止加载器),我想触发一些副作用。

我现在通过使用 tap() 并检查我稍后在 filter() 函数中检查的相同谓词来实现这一点。我觉得这很糟糕/有更合适的方法来实现这一点。

private setUserSearchObservable() {
    this.userSearch = userSearch$.pipe(
      tap(() => this.loading = true),
      debounceTime(500),
      this.filterValuesWithErrorMessages(),
      ......
    );
}

private filterValuesWithErrorMessages() {
    return pipe(
      tap((val: string) => { if (this.usernamesMatch(val)) { this.errorMessage = 'You will be added to the frame automatically'; this.loading = false; }}),
      tap((val: string) => { if (this.usernameInArray(val)) { this.errorMessage = 'User is already added'; this.loading = false; }}),
      tap((val: string) => { if (val.length < 2) { this.errorMessage = ''; this.loading = false; }}),
      filter((val: string) => (val.length >= 2 && !this.usernamesMatch(val) && !this.usernameInArray(val))),
    );
}

如您所见,在 filter() 上使用它们之前,我使用 tap() 明确检查完全相同的条件。是否有一种运算符/不同的模式可以让我以更简洁的方式实现这一目标?

【问题讨论】:

    标签: rxjs rxjs6 rxjs-pipeable-operators


    【解决方案1】:

    稍微重构了你的代码,没有专门的操作符来处理错误检查,你可以使用switchMap和inner observable例如ofnever来控制结果是否应该通过。

    private setUserSearchObservable() {
        this.userSearch = userSearch$.pipe(
          tap(() => this.loading = true),
          debounceTime(500),
          map((value) => this.filterValuesWithErrorMessages(value)),
          swtichMap(msg => {
            if (msg !== false) {
              this.errorMessage = result
              this.loading = false
              return never()
            }
            return of(true)
          })
        );
      }
    
      private filterValuesWithErrorMessages(val) {
        if (this.usernamesMatch(val)) return 'You will be added to the frame automatically'
        if (this.usernameInArray(val)) return 'User is already added'
        if (val.length < 2) return ''
        return false
      }
    

    【讨论】:

    • 我喜欢这个主意,不知道 never(); RxJS 最难的部分是以一种新的方式思考。谢谢!
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2018-02-27
    相关资源
    最近更新 更多