在不满足条件时取消 Observable 中链
Cancelling an Observable mid-chain when a condition is not met
是否可以在链中取消一个Observable?假设我们有一些相互依赖的事件链,如果一个链发生故障,则无需继续。
observable_1.pipe(
take(1),
switchMap((result_1) => {
// Do something that requires observable_1 and return something
// If it fails, there is no point to proceed
// If it succeeds, we can continue
}),
switchMap((result_2) => {
// Do something that requires result_2 and return something
// If it fails, there is no point to proceed
// If it succeeds, we can continue
}),
// etc...
);
因此您可以使用 filter 运算符来达到此目的:
observable_1.pipe(
take(1),
switchMap((result_1) => {
}),
switchMap((result_2) => {
// If it fails, there is no point to proceed
result_2.status = false;
// If it succeeds, we can continue
result_2.status = true;
return result_2;
}),
filter(result => result.status)
// etc...
);
看起来你需要 EMPTY
。
observable_1.pipe(
take(1),
switchMap((result_1) => {
// doing something
if (successful) {
return of(result_2);
}
return EMPTY; // no further emits.
}),
// we are here only in cases of result_2. EMPTY won't trigger it.
switchMap((result_2) => {
// doing something
if (successful) {
return of(result_3);
}
return EMPTY; // no further emits.
}),
// we are here only in cases of result_3. EMPTY won't trigger it.
);
是否可以在链中取消一个Observable?假设我们有一些相互依赖的事件链,如果一个链发生故障,则无需继续。
observable_1.pipe(
take(1),
switchMap((result_1) => {
// Do something that requires observable_1 and return something
// If it fails, there is no point to proceed
// If it succeeds, we can continue
}),
switchMap((result_2) => {
// Do something that requires result_2 and return something
// If it fails, there is no point to proceed
// If it succeeds, we can continue
}),
// etc...
);
因此您可以使用 filter 运算符来达到此目的:
observable_1.pipe(
take(1),
switchMap((result_1) => {
}),
switchMap((result_2) => {
// If it fails, there is no point to proceed
result_2.status = false;
// If it succeeds, we can continue
result_2.status = true;
return result_2;
}),
filter(result => result.status)
// etc...
);
看起来你需要 EMPTY
。
observable_1.pipe(
take(1),
switchMap((result_1) => {
// doing something
if (successful) {
return of(result_2);
}
return EMPTY; // no further emits.
}),
// we are here only in cases of result_2. EMPTY won't trigger it.
switchMap((result_2) => {
// doing something
if (successful) {
return of(result_3);
}
return EMPTY; // no further emits.
}),
// we are here only in cases of result_3. EMPTY won't trigger it.
);