当前位置: 首页 > 知识库问答 >
问题:

RxJS mergeMap运算符中的错误处理

楚威
2023-03-14

当我使用Angular HttpClient发出GET请求时,我得到一个可观察的返回,并在RxJS操作符mergeMap中处理它。

现在一次又一次地抛出404,我想抓住它。最后,浏览器控制台中不应出现错误消息,并且应使用流的下一个值处理管道。

这有可能吗?我没有用catchError()管理它。

以下是我的代码的简化版本:

    ...
    this.service1.getSomeStuff().pipe(
          mergeMap((someStuff) => {
            return from(stuff);
          }),
          mergeMap((stuff) => {
            return this.service2.getMoreStuff(stuff.id); // Here I need some error handling, if 404 occurs
          }),
          mergeMap((things) => {
            return from(things).pipe(
              mergeMap((thing) => {
                if (allLocations.some(x => x.id === metaData.id)) {
                  return this.service2.getMore(thing.id, thing.type, thing.img_ref);
                }
              }),
              map((thing) => {
              ...

更新:添加了带有catchError()的方法

我尝试过这种方式,但没有检测到错误,下一个mergeMap也不起作用(IDE不再识别thing.id、thing.type、thing.img\u ref等参数):

...
this.service1.getSomeStuff().pipe(
      mergeMap((someStuff) => {
        return from(stuff);
      }),
      mergeMap((stuff) => {
        return this.service2.getMoreStuff(stuff.id).pipe(
          catchError(val => of(`Error`))
        );
      }),
      mergeMap((things) => {
        return from(things).pipe(
          mergeMap((thing) => {
            if (allLocations.some(x => x.id === metaData.id)) {
              return this.service2.getMore(thing.id, thing.type, thing.img_ref);
            }
          }),
          map((thing) => {
          ...

共有1个答案

冀弘厚
2023-03-14

您需要使用retryretryWhen(名称不言自明)-这些操作员将重试失败的订阅(一旦发出错误,重新订阅源可观测)。

要在每次重试时提升id,可以将其锁定在一个范围内,如下所示:

const { throwError, of, timer } = rxjs;
const { tap, retry, switchMap } = rxjs.operators;

console.log('starting...');

getDetails(0)
  .subscribe(console.log);


function getDetails(id){
  // retries will restart here
  return of('').pipe(
    switchMap(() => mockHttpGet(id).pipe(
      // upon error occurence -- raise the id
      tap({ error(err){
        id++;
        console.log(err);
      }})
    )),  
    retry(5) // just limiting the number of retries
             // you could go limitless with `retry()`
  )
}

function mockHttpGet(id){
  return timer(500).pipe(
    switchMap(()=>
      id >= 3
      ? of('success: ' + id)
      : throwError('failed for ' + id)
    )
  );
}
<script src="https://unpkg.com/rxjs@6.4.0/bundles/rxjs.umd.min.js"></script>
 类似资料:
  • 问题内容: 应该返回什么?根据我的计算,应该是,但是解释器会返回。 这是Python的事情,还是我的数学很糟糕? 问题答案: 根据docs,其优先级高于,因此您的代码等同于。为了获得理想的结果,您可以将其放在括号中 或使用内置功能 或功能(返回值)

  • 我在条件运算符的true子句中得到了未定义属性的意外行为: 示例:Javascript: 不停摆弄 预期的行为是获取一个日志条目,上面写着"未定义,而是抛出了一个错误:。怎么会这样,对象被选中,它永远不会执行htis coe路径。一个工作示例是: 不停摆弄

  • 问题内容: 您认为在PHP中使用@运算符来抑制错误/警告是否有效,而您可能正在处理该错误? 如果是这样,您将在什么情况下使用它? 欢迎使用代码示例。 编辑:注释给回复者。我不想关闭错误报告功能,但是,例如,通常的做法是使用 然后再检查…但是您可以通过执行以下操作来消除@ 或类似。 我想问题是-是否有@HAS可以用来阻止错误,并且不能以任何其他方式处理? 问题答案: 我将抑制该错误 并进行处理 。否

  • 本文向大家介绍PHP错误控制运算符,包括了PHP错误控制运算符的使用技巧和注意事项,需要的朋友参考一下 介绍 在PHP中,将@符号定义为错误控制运算符。当它以任何表达式为前缀时,PHP解析器在执行时遇到的任何错误都将被抑制,并且该表达式将被忽略。 以下代码尝试打开一个不存在的文件进行读取操作,但是PHP解析器报告警告 示例 输出结果 将显示以下结果 在fopen()表达式前添加@符号可抑制错误消息

  • 主要内容:算术运算符,关系运算符,逻辑运算符,赋值运算符,按位运算符运算符是一个符号,它告诉编译器执行特定的数学或逻辑操作。 在批处理脚本中,以下类型的操作符是可以执行的。 算术运算符 关系运算符 逻辑运算符 赋值运算符 按位运算符 算术运算符 批处理脚本语言支持任何语言的普通算术运算符。 以下是可用的算术运算符。 算术运算符示例 运算符 描述 示例 两个操作数相加 的结果为: 从第一个减去第二个操作数 的结果为: 两个操作数的乘法 的结果为: 分母除以分子 的结

  • 本文向大家介绍如何处理R中的错误“ $运算符对于原子向量无效”?,包括了如何处理R中的错误“ $运算符对于原子向量无效”?的使用技巧和注意事项,需要的朋友参考一下 发生此错误的原因是$运算符不是设计用来访问向量元素的。如果我们使用$运算符来访问向量元素,则R无法理解它并认为它是无效的,因此,对于使用$运算符的位置,我们必须非常小心。当我们给元素命名并开始考虑将它们视为数据框列时,就会发生这种情况,