在嵌套和依赖订阅中手动触发错误函数

Posted

技术标签:

【中文标题】在嵌套和依赖订阅中手动触发错误函数【英文标题】:Trigger Error function manually inside nested and dependent Subscriptions 【发布时间】:2018-09-25 21:05:36 【问题描述】:

在我正在开发的 Angular 5 应用程序中,我必须手动触发 observable 的错误。我已经看过一个类似的问题here,但没有结果。带有 Observable 的函数有两个嵌套的 observables(示例中为getSubscription)。

这是Plunker (link)上的一个小例子。 我的代码在app.component.ts 内。 triggerErrorgetSubscription 是关键元素。重要的部分是两个嵌套和依赖订阅。为简单起见,我对两个订阅使用相同的调用,它们应该是两个嵌套订阅的占位符,在实际应用中,它们将是两个不同的订阅

无论是抛出错误还是发送成功响应,订阅总是跳转到结果成功的方法。订阅怎么可能在出错的情况下跳转到对应的方法?

具有两个嵌套且相互依赖的订阅的结构非常重要,在提出解决方案时必须考虑!

【问题讨论】:

代码在哪里? @Melchia 问题中有一个指向 plunker 的链接 您的代码实际上看起来很奇怪。你为什么要再次订阅同样的this.earthquakeService.getRecentEarthquakes方法里面的map函数呢? @GHB 我根据你的观点编辑了我的问题 【参考方案1】:

如果您使用 angular 5 ,那么您最好使用 HttpClient 而不是 Http。然后您可以将管道用于您的 http 方法并在其中编写 catchError 函数。

Read this article

注意 1. 如果您的客户端来源(即 localhost:4200 )与您的服务器来源不同,那么您必须使用角度代理从服务器接收适当的错误。

阅读How to set proxy on an angular Cli project

最后,要自定义和翻译您的错误,您可以使用如下函数到您的服务中。

private handleError(error: HttpErrorResponse) 
  if (error.error instanceof ErrorEvent) 
    // A client-side or network error occurred. Handle it accordingly.
    console.error('An error occurred:', error.error.message);
   else 
    // The backend returned an unsuccessful response code.
    // The response body may contain clues as to what went wrong,
    console.error(
      `Backend returned code $error.status, ` +
      `body was: $error.error`);
  
  // return an ErrorObservable with a user-facing error message
  return new ErrorObservable(
    'Something bad happened; please try again later.');
; 

将从 HttpClient 管道调用。如下所示

getConfig() 
  return this.http.get<Config>(this.configUrl)
    .pipe(
      catchError(this.handleError)
    );

希望对您有所帮助。

【讨论】:

【参考方案2】:

我认为您的 getSubscription 函数不正确。你可以简单地把它改成这样:

getSubscription(): Observable<boolean> 
        return this.earthquakeService.getRecentEarthquakes().map((recent) => 
            if(false) 
                return true;
             else 
                console.log('error thrown');
                throw Observable.throw('ERROR');
            
        );
    

当您使用 map on 和 observable 时,最后您将返回另一个 observable。稍后您可以订阅结果。无需再次在地图内订阅

更新:

如果你想使用两个不同的 observables,你可以像这样将它们链接在一起:

getSubscription(): Observable<boolean> 
        return this.earthquakeService.getRecentEarthquakes().map((recent) => 
            // doing something with "recent" 
        ).switchMap((recent)=>
          // you can use some condition here to either use the inner observable,
          // or return some other observable. just remember that you should return 
          // `Observable` here. this is the inner observable:
              return this.earthquakeService.getRecentEarthquakes()
            ).map((next) => 
                    if(false) 
                    return true;
                 else 
                    console.log('error thrown');
                    throw Observable.throw('ERROR');
                
                );
        

【讨论】:

在本例中,您只有一个订阅。嵌套和依赖方面对我来说非常重要 其他嵌套订阅的具体用途是什么? 与示例不同,有两个不同的订阅/可观察对象。根据第一次订阅的结果,调用第二次订阅。如果在第二次订阅中发生错误,则应将此数字提高到顶部。 所以你的意思是在 triggerError 函数内部,你想订阅嵌套 observable 的结果? 我想订阅更高的下标的结果,这取决于内部的。

以上是关于在嵌套和依赖订阅中手动触发错误函数的主要内容,如果未能解决你的问题,请参考以下文章

推送订阅错误未触发捕获

如何在沙盒中手动触发 Paypal 错误 10486?

从 Outlook COM 加载项手动触发 Windows 错误报告

您将如何手动触发将错误从节点快递记录到哨兵?

嵌套在类型中的 Apollo 服务器订阅

在配置触发器时更新表中的列时出现错误