【发布时间】:2018-06-16 01:07:19
【问题描述】:
我有三个 observables,由 HttpClient 的 get() 方法返回。我使用 forkJoin 运算符是为了在所有请愿结束时获得信号。
const responses = [
this.http.get('http://localhost:3000/articles').pipe(
map( data => this.articles = data ),
catchError( err => throwError("Can't get the articles list") )
),
this.http.get('http://localhost:3000/notas').pipe(
map( data => this.news = data ),
catchError( err => throwError("Can't get the news list") )
),
this.http.get('http://localhost:3000/users').pipe(
map( data => this.users = data ),
catchError( err => throwError("Can't get the users list") )
)
];
forkJoin(responses).pipe(
catchError( err => throwError(err) )
).subscribe(
response => console.log('All data loaded')
);
如果第一个 HTTP 请求抛出错误,则发出其他 HTTP 请求,但不执行相应的回调。我在rxjs docs 上读到“如果在某些时候任何输入 Observable 错误,forkJoin 也会出错,并且所有其他 Observable 将立即取消订阅。”。所以我猜我的 forkJoin 正在按预期工作,但是我没有得到我需要的功能。
那么:如何使用 forkJoin 或任何等效方法确保发出所有请求并执行所有回调,即使其中一个抛出错误?
【问题讨论】:
-
看来诺言在这里可能是最好的
-
@inorganik 但这对我来说似乎是一个典型的场景,HttpClient 服务与 observables 一起工作。我希望有一种方法可以用 observables 做到这一点。
-
@inorganik 你将如何使用承诺来获得我需要的东西?如果任何请求失败,Promise.all() 也会停止。
-
似乎如果您指望请求抛出错误,那么您经常错误地构建您的应用程序。如果是空响应或 401,请将其设置为请求不会出错。通常只有 400、404 或 500 会导致您的请求出错,而这在您的应用中很少会发生
-
我并不经常指望错误,我只是想管理外部 API(不是我的应用程序)可能抛出的错误。
标签: angular observable rxjs6