在嵌套和依赖订阅中手动触发错误函数
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
内。 triggerError
和 getSubscription
是关键元素。重要的部分是两个嵌套和依赖订阅。为简单起见,我对两个订阅使用相同的调用,它们应该是两个嵌套订阅的占位符,在实际应用中,它们将是两个不同的订阅
无论是抛出错误还是发送成功响应,订阅总是跳转到结果成功的方法。订阅怎么可能在出错的情况下跳转到对应的方法?
具有两个嵌套且相互依赖的订阅的结构非常重要,在提出解决方案时必须考虑!
【问题讨论】:
代码在哪里? @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 的结果?
我想订阅更高的下标的结果,这取决于内部的。以上是关于在嵌套和依赖订阅中手动触发错误函数的主要内容,如果未能解决你的问题,请参考以下文章