我想在flatMap中有一个条件来检查第一个observable返回的内容。如果条件不满足,我想打破并导航到不同的页面。
this.service.getData(id)
.flatMap((data) => {
if (!data) {
return Observable.throw(new NoDataFoundError());
}
return Observable.forkJoin(
this.service.getData2(id2),
this.service.getData3(id3),
);
})
.subscribe(
([data2, data3]) => {
this.data2= data2;
this.data3= data3;
},
(err) => {
if (err instanceof NoDataFoundError) {
this.router.navigate(...);
}
}
);
目前我正在抛出特定的错误并抓住它但是我不喜欢这个解决方案,因为它不是唯一可能引发错误的代码片段而且if不是缩放。< / p>
我考虑过滤器或takeWhile操作员,但我无法执行重定向。
我还考虑过返回Observable.of而不是扔(第4行),但后来我必须在订阅中做if也闻起来。
答案 0 :(得分:8)
您可以在this.router.navigate
内执行return Observable.empty()
和.flatMap
。这样您就会有一个if
语句。
.flatMap(data => {
if (!data) {
this.router.navigate(...);
return Observable.empty();
}
return (...);
})
但通常 Observables应该是懒惰和纯粹的(没有副作用)这将使它们可预测且易于撰写。副作用应仅由订阅者执行。
在您的具体情况下,似乎正确的解决方案是将此逻辑放入路线保护中,如此处所述 - https://stackoverflow.com/a/39162538/3772379