我不确定这里还有什么要说的。
值得注意的是,EMPTY 是一个 RxJs 流,它什么都不发出并立即完成。它有点像“中断”(以一种非常松散的方式。从流中“中断”的方式可能非常依赖于上下文)。
this.service.create('/api/employee').pipe(
catchError(err1 => {
// do some stuff
return throwError(err1);
}),
switchMap(resp1 => {
// do some stuffs
if(someCondition(resp1)){
return this.service.update('/api/salary/', id).pipe(
catchError(err2 => {
// do some stuff
return throwError(err2);
}),
);
}
return EMPTY;
}),
switchMap(resp2 => {
// do some stuff
if(someCondition(resp2)){
return this.service.delete('/api/education/', id).pipe(
catchError(err3 => {
// do some stuff
return throwError(err3);
}),
);
}
return EMPTY;
}),
).subscribe({
next: resp3 => { /*do some stuff*/ },
complete: () => { /*Your stream is done*/ },
eror: err => { /*All re-thrown errors end up here */ }
});
更新
使用tap 帮助理解流
tap 是一个运算符,它返回它接收到的相同流。它不能对您的流进行任何更改,但它可以查看在任何给定点发生的情况。这可能是帮助您理解的有用工具。
http1().pipe(
tap({
next: val => console.log("Result from http1 call: ", val),
complete: () => console.log("http1 call completed"),
error: err => console.log("http1 call errored: ", err)
})
switchMap(val => http2(val).pipe(
tap({
next: val => console.log("Result from http2 call: ", val),
complete: () => console.log("http2 completed"),
error: err => console.log("http2 call errored: ", err)
})
)),
tap({
next: val => console.log("Result from switchMap operator: ", val),
complete: () => console.log("switchMap completed"),
error: err => console.log("switchMap (http1 or http2 call) errored: ", err)
})
).subscribe()
在这里我们可以看到switchMap 之前和之后发生的情况。您可以看到,在这种情况下,switchMap 从 http1 获取值并从 http2 发出值。
因为 switchMap 在生成 http2 之前会等待来自 http1 的值,所以一个副作用是 http2 直到 http1 发出后才会启动。这确实意味着这些调用是按顺序执行的,但如果 http1 多次发出,情况就会变得更加复杂。
更多关于: