RxJS debounceTime(0)仍延迟执行

时间:2018-12-07 17:59:43

标签: javascript angular rxjs6

我正在使用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));
    }
  }

2 个答案:

答案 0 :(得分:1)

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

store.service.ts

因此应更改以下代码

startTime := %A_TickCount%

;Do your things

elapsedTime := startTime - %A_TickCount%

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

您不需要手动调用存储功能,因此也可以将其删除。

有效的示例代码在这里-https://stackblitz.com/edit/angular-5ajqn9

答案 1 :(得分:0)

我的问题的答案是将验证呼叫移至(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');
        }
      });
  }