【问题标题】:RxJS debounceTime(0) still postpones executionRxJS debounceTime(0) 仍然推迟执行
【发布时间】:2018-12-10 15:47:58
【问题描述】:

我正在使用 Angular 7 和最新的 RxJS 和 ngrx/store。我遇到了debounceTime(0) 的问题。 debounceTime 是ui-input 组件的@Input() 属性。它的默认值为0。我希望有可能将debounceTime 用于某些输入 - 对于其他输入 - 不。我从商店获得的输入值。另外,我有一个验证服务应该验证输入值。我通过选择器将输入值传递给验证服务。问题是在验证服务中我得到了以前的值。这是一个简化的(更新)example。我有验证规则:input.length > 2。当长度大于 2 时,我想得到一个错误。但是使用 debounceTime(0),只有当输入的长度为 4 时,我才会在控制台中收到验证错误。

如果我删除 debounceTime - 一切都按预期工作。我收到一个同步调用:

我该如何解决这个问题?我没有找到任何有条件地应用 debounceTime 的变体。另外,我认为这样的事情不是一个好的解决方案:

ngOnInit() {
    if (this.debounceTime > 0) {
      this._valueChanged
        .pipe(
          debounceTime(this.debounceTime),
        )
        .subscribe(value => this.inputted.emit(value));
    } else {
      this._valueChanged
        .subscribe(value => this.inputted.emit(value));
    }
  }

【问题讨论】:

  • 你真的要全部链接吗?
  • 你到底是什么意思?

标签: javascript angular rxjs6


【解决方案1】:

您不应该从 Subject 或 BehaviorSubject 获取值,而是应该订阅它。

store.service.ts

所以下面的代码应该改一下

  process() {
    console.log('Store:   ', this.value$.getValue());
  }

 constructor(){
    this.value$.subscribe(v=>{
      console.log('Store:   ', v);
    })
  }

你不需要手动调用 store 函数,所以你也可以删除它。

工作示例代码在这里 - https://stackblitz.com/edit/angular-5ajqn9

【讨论】:

  • 感谢您的回复,但可能我没有充分说明我的问题。我更新了 plunker
【解决方案2】:

我的问题的答案是将验证调用移动到与 (inputted) 事件相同的位置 - onInit

ngOnInit() {
    this._valueChanged
      .pipe(
        debounceTime(this.debounceTime),
      )
      .subscribe(value => {
        this.inputted.emit(value);
        const isValid = this.valdiationService.validate('myInput');
        if (isValid) {
          console.error('Input is not valid');
        }
      });
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多