首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角,Http错误阻止任何进一步的请求。

角,Http错误阻止任何进一步的请求。
EN

Stack Overflow用户
提问于 2020-12-14 17:00:47
回答 1查看 256关注 0票数 0

在服务器发出错误响应后,我的应用程序不会再发送任何请求。

我发送请求时:

代码语言:javascript
复制
getMachineRules(rules: Array<string>): Observable<RulesResults> {
    return this.http.post<RulesResults>('/rules', { nodes: rules })
      .pipe(
        catchError(this.handleError)
      );
  }

我的errorHandler:

代码语言:javascript
复制
  handleError(error) {
    if (error.error instanceof ErrorEvent) {
      console.error('An error occurred:', error.error.message);
    } else {
      console.error(
        `Backend returned code ${error.status}, ` +
        `body was: ${JSON.stringify(error.error)}`);
    }
    return throwError('Something bad happened; please try again later.');
  }

我的管道是这样的:

代码语言:javascript
复制
  ngAfterViewInit() {
    this.rulesChanged
      .pipe(
        startWith({}),
        switchMap(() => {
          this.isLoadingResults = true;
          return this.settings.getMachineRules(this.currentRules);
        }),
        map(data => {
          this.isLoadingResults = false;
          this.resultsLength = data.inputs?.length || 0;
          return data;
        }),
        catchError(e => {
          console.log("Error caught");
          this.isLoadingResults = false;
          this.resultsLength = 0;
          return observableOf({ inputs: [] } as RulesResults);
        })
      ).subscribe(
        data => { return this.updateRules(data); },
      );
  }

我可以在控制台中看到“捕获的错误”消息,即使在错误情况下,updateRules()方法似乎也能正常工作。

但是,在404-Error响应之后,不再调用ngAfterViewInit()方法。UI钢对交互作用作出反应。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 17:23:17

一旦Obsevable失败,您就无法再次激活它,catchError用于通过返回新的可观察或抛出错误来处理错误。如果主流失败,observableOf({ inputs: [] } as RulesResults)将作为替代,这意味着您的主要可观察到的永远不会再次发出。

考虑在管道的末尾使用retry,或者让您的catchError返回可观察到的源本身,如下所示:

代码语言:javascript
复制
catchError((error, source) => {
 ....
  return source;
})

或者将catchError操作符放置在switchMap中,以便只有内部流会失败,而外部(主)流将保持活动状态,如下所示:

代码语言:javascript
复制
ngAfterViewInit() {
  this.rulesChanged
    .pipe(
      startWith({}),
      switchMap(() => {
        this.isLoadingResults = true;
        return this.settings.getMachineRules(this.currentRules).pipe(
          map(data => {
            this.isLoadingResults = false;
            this.resultsLength = data.inputs?.length || 0;
            return data;
          }),
          catchError(e => {
            console.log("Error caught");
            this.isLoadingResults = false;
            this.resultsLength = 0;
            return observableOf({ inputs: [] } as RulesResults);
          })
        )
      })
    ).subscribe(
      data => { return this.updateRules(data); },
    );
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65293193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档