【问题标题】:Subscribe to another observable when request failed请求失败时订阅另一个 observable
【发布时间】:2023-03-28 20:23:01
【问题描述】:

我有一个调用服务方法myService.createResource() 的方法。当它失败时,我将isResourceCreatingFailed 设置为true

doSomething(): void {
    this.myService
      .createResource()
      .pipe(
        finalize(() => {
          this.isLoading = false;
        })
      )
      .subscribe(
        () => {
          // ... some event emits 
        },
        (error) => {
          this.isResourceCreatingFailed = true;
        }
      );
  }

myService 中的createResource 方法如下所示:

  createResource(body) {
    return this.http.post(url, body).pipe(
      switchMap((response) => {
        return this.pollUntilResourceCreated(response.id).pipe(
          timeout(8000),
          catchError((error) => throwError(error))
        );
      })
    );
  }

首先它发出一个 HTTP 调用来创建一个资源。在最坏的情况下,它可能需要长达 10 秒,如果失败,我需要再次调用 myService.deleteResourse().subscribe(),但也会抛出一个错误,以便在我的第一个代码示例中将 isResourceCreatingFailed 设置为 true。我添加了catchError((error) => throwError(error)),它返回一个错误,但最好的位置是myService.delete()

myService.deleteResourse() 将始终从createResourse 调用,这就是我想保留它的原因。

【问题讨论】:

  • 所以你想用同样的请求再调用同样的 API 1 次?
  • 嗨!不,我想做myService .createResource(),但如果它失败了我想做deleteResource()

标签: javascript angular typescript rxjs


【解决方案1】:

首先想到在doSomething中添加“完成”方法:

doSomething(): void {
    this.myService
      .createResource()
      .pipe(
        finalize(() => {
          this.isLoading = false;
        })
      )
      .subscribe(
        () => {
          // ... some event emits 
        },
        (error) => {
          this.isResourceCreatingFailed = true;
        }, 
        () => {
          this.anotherService.anotherRequest().subscribe() //and go on
        }
      );
  }

编辑

您为什么不想在出错的块中编写与另一个服务一起工作的逻辑?

(error) => {
   this.isResourceCreatingFailed = true;
   this.anotherService.anotherRequest().subscribe()
}

如果我误解了什么,请解释一下

【讨论】:

  • 嗨!抱歉,我已经更新了我的问题。 anotherService.anotherRequest() 实际上是 myService.deleteResourse()。它总是会从 createResource 中调用,这就是我想保留它的原因。另一件事,我认为在另一个 .subscribe() 内部做 .subscribe() 不是一个好习惯
  • 如果你想在订阅后做一些事情你必须在订阅中做,没有其他变种。这不是一个坏习惯。可以单独取出myService.deleteResourse()订阅美颜后给他打电话:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-14
  • 2020-08-29
  • 2019-12-03
  • 2019-05-15
  • 1970-01-01
  • 2017-07-08
相关资源
最近更新 更多