RxJS debounceTime(0) 仍然推迟执行
RxJS debounceTime(0) still postpones execution
我正在使用 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));
}
}
您不应从 Subject 或 BehaviorSubject 获取值,而应订阅它。
store.service.ts
因此应更改以下代码
process() {
console.log('Store: ', this.value$.getValue());
}
到
constructor(){
this.value$.subscribe(v=>{
console.log('Store: ', v);
})
}
您不需要手动调用存储函数,因此您也可以将其删除。
工作示例代码在这里 - https://stackblitz.com/edit/angular-5ajqn9
我的问题的答案是将验证调用移动到与 (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');
}
});
}
我正在使用 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));
}
}
您不应从 Subject 或 BehaviorSubject 获取值,而应订阅它。
store.service.ts
因此应更改以下代码
process() {
console.log('Store: ', this.value$.getValue());
}
到
constructor(){
this.value$.subscribe(v=>{
console.log('Store: ', v);
})
}
您不需要手动调用存储函数,因此您也可以将其删除。
工作示例代码在这里 - https://stackblitz.com/edit/angular-5ajqn9
我的问题的答案是将验证调用移动到与 (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');
}
});
}