在 Rxjs 6 中使用 concat 和管道的正确方法是什么?

What is the correct way to use concat along with pipe in Rxjs 6?

我有一个服务器调用可能 return HTTP 202。受 线程的影响,我有以下内容:

this.http.get(url)
  .pipe(
    map(response => {
      if (response.status === 202) {
        throw response;
      }
      return response;
    }),
    retryWhen(errors => {
      return errors.pipe(
        delay(1000),
        take(3),
        concat(response => Observable.throw('Retries exceeded'))
      );
    }),
    catchError(handleError)
  );

收到关于使用 concatdeprecated 警告。我知道新的 concatrxjs 而不是 rxjs/operator.

但是,在这里使用新的 static concat 运算符的正确方法是什么?

找到以下from this site

import { concat } from 'rxjs/operators';
a$.pipe(concat(b$, c$));

// becomes

import { concat } from 'rxjs';
concat(a$, b$, c$);

我无法理解我的示例代码中连接了哪些 Observable

更新 1

将代码更改为:

return concat(this.http.get(url)
  .pipe(
    map(response => {
      if (response.status === 202) {
        throw response;
      }
      return response;
    }),
    retryWhen(errors => {
      return errors.pipe(
        delay(1000),
        take(3)
      );
    }),
    catchError(handleError)
  ), response => Observable.throw('Retries exceeded'));

但这会导致:

core.js:1598 ERROR TypeError: You provided 'function (response) { return rxjs__WEBPACK_IMPORTED_MODULE_2__["Observable"].throw('Retries exceeded'); }' where a stream was expected. You can provide an Observable, Promise, Array, or Iterable.
at subscribeTo (subscribeTo.js:41)
at subscribeToResult (subscribeToResult.js:6)
at 

管道运算符只是接受可观察对象和 return 可观察对象的函数。所以你可以像这样使用 concat 工厂函数:

retryWhen(errors => {
  return errors.pipe(
    delay(1000),
    take(3),
    o => concat(o, throwError('Retries exceeded'))
  );
})

此外,concat 运算符将被 with/renamed 替换为 concatWith。参见 this issue