RxJS задержка switchMap новое наблюдаемое выполнение - PullRequest
1 голос
/ 01 октября 2019

В моем проекте Angular я делаю какой-то вызов HttpClient, и после ответа мне нужно проверить его тело и выполнить другой вызов HttpClient или нет, в зависимости от первого ответа. Также мне нужно на некоторое время задержать выполнение второго вызова HttpClient.

Я могу сделать это с помощью оператора switchMap, но я хотел бы знать , как правильно отложить второй вызов http way.

Вот очень простой пример:

export class AppComponent  {
  ngOnInit() {
    this.execute().subscribe(r => console.log(r))
  }

  execute(): Observable<string> {
    return this.http1Call().pipe(switchMap((r) => {
     // Checking if 2d http call must be executed or not
      if (r === '1st call') {
        console.log('---Invalid 1st call, executing 2d')
        // TODO: Is that correct way to execute http2Call with delay ???
        return of({}).pipe(delay(3000), switchMap(() => this.http2Call()))
      }

      return of(r);
    }));
  }

  http1Call(): Observable<string> {
    return of('1st call').pipe(delay(1000));
  }

  http2Call(): Observable<string> {
    console.log('------Inside http2Call')
    return of('--------2d call response').pipe(delay(3000));
  }
}

1 Ответ

2 голосов
/ 01 октября 2019

То, что у вас есть, в основном хорошо, вы можете просто упростить (или, может быть, сделать более очевидным) ту часть, где вы делаете задержку:

return timer(3000).pipe(switchMapTo(this.http2Call()))

timer() с одним параметромбудет излучать только один раз после задержки. Вы также можете использовать concatMap/concatMapTo вместо switchMap/switchMapTo, потому что в этом случае вы никогда ничего не переключите (timer испускает только один раз, а затем завершается).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...