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

rxjs中多次调用的角度句柄错误

严子默
2023-03-14

在这种特殊情况下,我不知道用rxjs处理html错误的最佳方式:

component.ts

private open() {
  this.openSubscription = this.openService
    .open(this.id)
    .subscribe(res => {
      if (res) {
        // do something with result
      } else {
        this.openInError = true;
      }
    });
}

打开服务.ts

open(id: number): Observable<OpenContext> {
  const openContextObservable = new Observable<OpenContext>(
  observer => {
  this.openApiService
    .first(id)
    .pipe(
      catchError(err => of(err))
    )
    .subscribe(res => {
      this.openApiService
        .second(res.param1)
        .pipe(
          map(result=> {
            // do something with the result
            observer.next(openContext);
            observer.complete();
          }),
          catchError(err => of(err))
        )
    })
})}

在服务API中,我只是返回this.http.post(…),其中一些参数为可观察的

我想先捕捉错误,并在组件的订阅中处理它(subscribe(res =)

执行此操作并拥有干净代码的最佳方法是什么?我使用throwError进行了测试,…但我被阻止了…

因此,组件中预期的代码将是:

private open() {
  this.openSubscription = this.openService
    .open(this.id)
    .subscribe(
    res => {
      if (res) {
        // do something with result
      }
    },
    err => {
      if (err) {
        this.openInError = true;
      }
    });
}

或类似的东西。管道和地图。

共有1个答案

郑博
2023-03-14

1.) 删除 catchErrors,因为这将捕获错误并将错误流转换为非错误流。

2.) 使用 switchMap 而不是嵌套订阅。

打开服务.ts

import { switchMap } from 'rxjs/operators';
....
open(id: number): Observable<OpenContext> {
  // you can get rid of openContextObservable as well.
  return this.openApiService
    .first(id)
    .pipe(
      // switch to this observable from the first one
      switchMap(res => this.openApiService.second(res.param1)),
      map(result => {
        // do stuff and transformations here but make sure you return result for your subscriber.
        return result;
      })
    );
)}

成分

private open() {
  this.openSubscription = this.openService
    .open(this.id)
    .subscribe(
    res => {
      if (res) {
        // do something with result
      }
    },
    err => {
      if (err) {
        this.openInError = true;
      }
    });
}
 类似资料:
  • 我有一个HTTP请求,希望将结果共享给多个组件。当然,HTTP请求返回一个可观察的。我希望多个组件能够订阅此服务,而不会触发额外的HTTP请求。 我在一个组件中使用实现了这一点,该组件按需发出HTTP请求,并有另一种方法订阅该主题。虽然这是可行的,但似乎有些过分,而且肯定有更好的方法。 主题服务 和一个订户 和第二个订户 从管道链中删除时,会发出多个网络请求。是否有一种更优雅/正确的方式将观察到的

  • 在我的角度应用程序中,我将状态作为 BehaviorSubject 存储在服务中,当数据来自服务器时,我调用下一个函数来更新数据并通知所有订阅者。 伪代码: 由于很多组件都订阅了该 BehaviorSubject,我认为在我的应用程序加载时可能会导致一些性能问题:在加载时,有很多来自服务器的通知,每次下一个函数称为组件时都会渲染。 你认为如果我将呼叫延迟到大约500毫秒后,我会看到性能提高吗?rx

  • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

  • 我有以下2个组件,它们应该首先从Mongo中删除文档,然后从Elastic中删除。 主要流程: 服务: 不幸的是,deleteDocumentInMongo从未被调用。我可以在日志中看到bean已正确注册。 我是做错了什么,还是你需要更多的调试信息?如果我窃听手柄,则deleteDocumentInES。执行输入,但忽略mongo流。

  • 我在这里安装有棱角的材料就是我所做的 通过以下命令成功安装了Angle material Angula CDK无法使用以下命令安装 我在cmd中遇到以下错误: 参考我从来没有这个问题,这发生在我卸载了cdk和角材料之后,所以现在我试图再次安装它, 我需要做什么来解决这个问题?

  • 问题内容: 我正在开发一个巨大的旧版Java应用程序,其中包含许多手写内容,如今您可以让一个框架来处理。 我现在面临的问题是,我们的Solaris Server上的文件句柄用尽了。我想知道跟踪打开文件句柄的最佳方法是什么?在哪里查看,什么会导致打开的文件句柄用尽? 我不能在Solaris下调试应用程序,只能在Windows开发环境上调试。分析Windows下的打开文件句柄是否甚至合理? 问题答案: