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

管道HTTP调用时RxJS SwitchMap错误

宰父熙云
2023-03-14

我有一个组件调用我的服务,如下所示:

this.authService.login$(userRegistration).subscribe(result => {
// Doing things here
});

authservice调用如下所示:

login$(userRegistration: UserRegistrationRequest): Observable<AuthResult> {
        return this.http.post<AuthResult>(url, userRegistration)
        .pipe(
            switchMap(result => {
                if(result.errors || result.errors.length !== 0) {
                    throw(result.errors);
                }

                // do things and then
                return of(result);
            }),
            error => {
                throw(error);
            }
        );
    }

这导致http帖子永远不会被触发,并立即与上面的图像发生错误。如果我删除了switchMap,只返回服务中的可观察值,然后在组件中订阅它,则调用成功。

我错过了什么吗?我对rxjs相对较新,所以我不确定我是否误解了什么,但任何帮助都将不胜感激。

编辑:我还能够将switchMap移动到组件中,做我需要的事情,然后在最后调用一个订阅,它工作得很好。总的来说,这是更好的做法吗?

共有1个答案

吉玉宸
2023-03-14

错误()不是RxJS中包含在管道()中的有效运算符,相反,您想使用catchError()来处理特定的错误情况。然而,看看您的示例,您不需要使用它,因为Angular会捕获从您的HTTP可观察到的抛出的任何错误。

此外,您不需要使用开关地图,因为您不依赖于另一个可观察的。只需使用map()运算符并返回结果而不是(结果)的

login$(userRegistration: UserRegistrationRequest): Observable<AuthResult> {
  return this.http.post<AuthResult>(url, userRegistration)
  .pipe(
      map(result => {
          if(result.errors || result.errors.length !== 0) {
              throw(result.errors);
          }

          // do things and then
          return result;
      })
  );
}

 类似资料:
  • 传递参数 链接管道 我们可以将多个管道连接在一起,以便在一个表达式中使用多个管道。

  • 我需要通过同一个连接向Rest服务器发送多个异步请求,并以FIFO顺序执行它们,我认为HTTP 1.1流水线非常适合这个。 我在Netty上发现了一些相关问题,但我在他们的用户指南上找不到太多,在他们的测试用例上也找不到任何东西。 Netty是否支持HTTP 1.1流水线?这将如何实现? 一个例子将不胜感激。 相关问题 - 未解答- 问题: HTTP 1.1 流水线与 HTTP 2 多路复用

  • 问题内容: 有任何方法可以从具有参数的另一个管道触发管道作业,我已经尝试过 也尝试过 和 没有运气,它说: 项目类型不支持参数 问题答案: 由于子作业是另一个多分支管道项目,因此我需要指定我要运行的分支 现在可以用了

  • 在提交下一个测试时,我在GitLab管道上遇到了一个错误。gitlab ci。yml用于存储库。 执行管道以构建解决方案、部署到Artifactory并触发和API调用 部署作业必须手动执行,并且有两种不同的作业选项可供执行 在您的应用程序中发现错误。gitlab ci。yml:“触发运动”工作需要“部署工作运动”工作,但“部署工作运动”不在任何前一阶段“触发其他人”工作需要“部署工作其他人”工作

  • TL;DR可以在可观察到的管道内使用forkJoin吗? 完整的故事:我有一个服务,返回可观察的对象数组。对于这些对象中的每一个,我都需要对返回可观察对象的服务进行另一个调用,并对每个结果应用另一个操作。 我目前的解决方案是: 我想摆脱第一个订阅,改用管道。问题是,forkJoin的教程将其显示为对象或数组的输入源,而不是管道的一部分。 从内部映射调用forkJoin 返回

  • 根据Andrew Bayer的说法,您不应该向其他人注入声明性管道。将来可能会有人支持它,但可能不会。 我目前正在尝试在管道中启动一个管道,但我想知道我需要做什么才能使它工作。jenkins网页上的文档说明,如果新作业或管道与第一个作业或管道位于同一文件夹中,则可以从直接名称或绝对路径调用它。我已经尝试了所有不同的方法,目前我正在尝试一个文件的绝对路径,我刚刚检查过它一秒钟前存在,但它说它不存在。