Угловой пользовательский асинхронный валидатор с socket.io - PullRequest
0 голосов
/ 27 июня 2019

У меня есть проект, использующий socket.io для вызовов данных на сервер. Эта часть работает полностью, но она использует функцию обратного вызова и не имеет наблюдаемой. Итак, моя проблема двоякая, и я не знаю, с чего начать.

Я пытаюсь создать собственный асинхронный валидатор, я видел, как это делается с помощью Obervables, поэтому я подумал, что первый набор - преобразовать мой вызов сокета в наблюдаемый.

Validator.ts

export class MyValidators {

 static rules(socket: WebSocketService) {
    return (control: AbstractControl): Observable<ValidationErrors | null> => {
      const val: string = control.value;

      const pwdRules: Observable<RuleInterface> = new Observable(observer => {
        socket.getParms((resp: SocketResponse<RuleInterface[]>) => {
          observer.next(resp.records[0]);
        });
      });

      return pwdRules.pipe(
        map(rule => val.length < rule.max_len ? null : {tooBig: true} )
      )
  }
}

Поэтому я преобразую свой вызов сокета в Observable, и они используют pipe и map для возврата объекта null или ошибки.

Мой компонент FormGroup выглядит так:

constructor(
    private fb: FormBuilder,
    private socket: WebSocketService
  ) { }
....

ngOnInit {
this.reset2Form = this.fb.group({
      val1: ['', [Validators.required, MyValidators .rules(this.socket)]],
      val2: ['', [Validators.required]]
    });

}

Когда я распечатываю ошибки val1, я получаю это.

{ 
   "_isScalar": false, 
    "source": { "_isScalar": false }, "operator": {} 
}

Я вижу из консоли, что вызов сокета никогда не вызывался.

Мой вопрос: что я делаю не так? Я так настроил наблюдаемое? Или как я использую трубу?

...