0

switchMap 不重复 HTTP 调用。

我创建了一个指令来验证电子邮件是否已经存在。

在该指令内部,是一个 API。每次按键发生时,都会调用 API 来检查它是否已经存在。

我正在使用 switchMap 来防止多个 HTTP 请求并取消以前的请求。

但问题是,一旦请求已经发出并被取消,它就不会再重复了。

例如 test@gmail.com - 取消请求

test2@gmail.com - 成功的 API

test@gmail.com(再次)- API 调用将不再发生。

为什么会发生这种情况(对我来说)?

我检查了 switchMap 操作员文档,但没有看到任何关于此的情况。

<input [(ngModel)]="sampleEmail" placeholder="Email"  isEmailExistsValidator>

export class isEmailExistsValidator implements AsyncValidator {
  constructor(private someService: SomeService) { }
  public validate(control: AbstractControl): Observable<ValidationErrors|null> { 

if (isNullOrUndefined(control.value)) {
  return of(null);
} 

return this.someService
  .isEmailExistsValidator(control.value)
  .pipe(
    switchMap((response) => {
      if (response.availability) {
        return of(null);
      } else {
        return of({ emailAlreadyExists: response.response });
      }
    })
  );
  }

}

public isEmailExistsValidator(email: string): Observable<EmailAvailability> {
return this.httpClient.get<EmailAvailable>('/api/sampleEmailValidation/' + email);

}

我希望 API 在任何电子邮件输入中都能成功。

4

1 回答 1

0

理想情况下,这不应该发生。

即使假设您的 API 引发了一些 http 错误并且您没有明确处理失败的 http 响应catchErrorasyncValidators使用随后的输入变化。

这是一个工作示例 - stackblitz

如果您可以提供可以重现问题的 stackblitz url,它将很容易为您提供帮助。

于 2019-09-06T10:43:10.217 回答