对主订阅调用的响应返回一些值的数组。这些值作为参数传递给我的子订阅数组。在这些订阅中,我想为dataArr分配值-当订阅收到“未找到”错误时,我想分配自定义值。当所有订阅都被调用后,我想在上次订阅调用之后执行最终代码。
问题是我无法用forkJoin实现它,因为根据RxJS文档,“如果内部可观察的对象不完整,forkJoin将永远不会发出值!”。我也尝试过合并和合并运算符。有什么想法吗?
this.service.get().subscribe(response => {
this.observables = [];
this.dataArr = [];
response.items.forEach(item => {
this.observables.push(this.otherService.get(item.data))
// I want this subscription to make this action
// this.otherService.get(item.data).subscribe(
// response => {
// this.dataArr.push({
// title: response.title,
// });
// },
// error => {
// this.dataArr.push({
// title: 'Not found!',
// });
// }
// )
});
Observable.forkJoin(this.observables).subscribe(
res => {
console.log(res)
}, err => {
console.log(err);
}, () => {
console.log('Completed!');
// execute other code on completion
}
);
});
答案 0 :(得分:0)
您可以使用forkJoin!
https://www.learnrxjs.io/operators/combination/forkjoin.html
请注意,如果提供给forkJoin错误的任何内部可观察变量将丢失将要或已经完成的任何其他可观察变量的值如果您未正确捕获内部可观察变量的错误< / strong>。如果您只关心所有内部观测值是否成功完成,则可以从外部捕获错误。
因此,只需确保当一个可观察对象抛出错误时,它仍会返回某些内容:
forkJoin(
this.service.observableA.pipe(
map(data => {
return { result: 'succes', data: data };
}),
catchError(err => {
console.log(err);
return of({ result: 'failed', data: null });
})
),
this.service.observableB.pipe(
map(data => {
return { result: 'succes', data: data };
}),
catchError(err => {
console.log(err);
return of({ result: 'failed', data: null });
})
)
).subscribe(
// This will be triggered even if one of the observables fail
);
当然,在subscribe方法中,您需要检查列表,并检查每个返回的响应的“结果”属性是“成功”还是“失败”。