RxJS延迟switchMap新的可观察的执行

时间:2019-10-01 19:06:48

标签: angular rxjs

在我的Angular项目中,我正在进行HttpClient调用,响应后,我需要检查它的主体并执行另一个HttpClient调用,这取决于第一个响应。另外,我还需要延迟第二个HttpClient调用的执行时间。

我可以使用switchMap运算符来做到这一点,但我想知道如何以正确的方式延迟第二个http通话

这是一个非常简单的示例:

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 个答案:

答案 0 :(得分:2)

基本上您可以拥有,您可以简化(或更明显)延迟的部分:

return timer(3000).pipe(switchMapTo(this.http2Call()))
具有一个参数的

timer()将在延迟后仅发出一次。您可能还使用concatMap/concatMapTo而不是switchMap/switchMapTo,因为在这种情况下,您将永远不会切换任何内容(timer仅发出一次然后完成)。