gpt4 book ai didi

javascript - DebounceTime 发出该时间内捕获的所有事件

转载 作者:行者123 更新时间:2023-12-01 01:00:39 27 4
gpt4 key购买 nike

我需要为 Angular 中的响应式(Reactive)表单类型编写异步验证器。我已经通过 promise 实现了它。但问题是验证器每次击键都会触发它,每次击键都会触发服务器。为了实现去抖,我已经为 Promise 实现了 setTimeout,但我面临的问题是它在我定义的某个毫秒后触发。最后,我在 promise 中实现了 Observable 以实现所有 debounceTime,但我在这里面临的问题是 debounceTime 发出所有事件。例如:如果我从输入字段中输入“Prem”,则以下代码会在超时时触发服务器四次。

如果异步验证器的实现有任何问题,请向我澄清。

//Latest code
static hasDuplicateEmail(formControl: FormControl) {
return new Promise((resolve, reject) => {
return new Observable(observer =>
observer.next(formControl.value)).pipe(
debounceTime(600),
distinctUntilChanged(),
switchMap((value) => {
//server side
return MotUtil.fetch('checkForRegisterEmail', {e: formControl.value});
})
).subscribe((res) => {
return (JSONUtil.isEmpty(res)) ? resolve(null) : resolve({duplicate: true});
});
});
}

debounceTime 应该按照文档中提到的方式工作。

最佳答案

你正试图以一种困难的方式来解决它。验证器接受参数 - AbstractControl。 AbstractControl 具有属性 - valueChanges,它返回 formControl 中的更改流。因此,在这里您添加 debouceTime ,然后执行其他操作,最后将此流返回给 FormControl:

hasDuplicateEmail(control: AbstractControl) {
return control.valueChanges.pipe(
debounceTime(600),
switchMap(e =>
this.http.get('checkForRegisterEmail', {e}).pipe(
map((res: any) => JSONUtil.isEmpty(res) ? null : { duplicate: true })
)
)
)
}

正如你所注意到的,我使用 HttpClient,因为它是你在 Angular 中进行 HTTP 调用的方式(它被设计为在流上工作,而不是在 Promises 上工作)

关于javascript - DebounceTime 发出该时间内捕获的所有事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56113536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com