【发布时间】:2020-08-07 23:50:44
【问题描述】:
import { fromEvent, interval, Subject, Observable, of } from "rxjs";
import { takeUntil, switchMap, catchError } from "rxjs/operators";
const obs1 = p1 => {
return new Observable(observer => {
setTimeout(() => {
console.log("obs1 doing");
observer.next(p1 + "1");
observer.complete();
}, 1000);
});
};
const obs2 = p2 => {
return new Observable(observer => {
setTimeout(() => {
console.log("obs2 doing");
observer.next(p2 + "2");
observer.complete();
}, 1000);
});
};
const obs3 = p3 => {
return new Observable(observer => {
setTimeout(() => {
console.log("obs3 doing");
observer.next(p3 + "3");
observer.complete();
}, 1000);
});
};
const obsError1 = () => console.log("obs1 is error")
const obsError2 = () => console.log("obs2 is error")
const obsError3 = () => console.log("obs3 is error")
const cancle = new Subject();
new Observable(observer => {
obs1(0).subscribe(
x1 => {
obs2(x1).subscribe(
x2 => {
obs3(x2).subscribe(
x3 => {
observer.next(x3);
observer.complete();
},
obsError3
);
},
obsError2
);
},
obsError1
);
}).pipe(takeUntil(cancle)).subscribe(()=>{
console.log()
});
setTimeout(() => {
console.log("cancle doing");
cancle.next();
cancle.complete();
}, 100);
当它运行cancle.next() 时,它仍然打印obs2 doing 和obs3 doing
我知道改成serial可以取消,比如:
setTimeout(() => {
console.log("cancle doing");
cancle.next();
cancle.complete();
}, 100);
of(0)
.pipe(
switchMap(x1 => obs1(x1)),
catchError(error => {
obsError1()
throw error;
})
).pipe(
switchMap(x2 => obs2(x2)),
catchError(error => {
obsError2()
throw error;
})
)
.pipe(
switchMap(x3 => obs3(x3)),
catchError(error => {
obsError3()
throw error;
})
).pipe(
takeUntil(cancle)
).subscribe(x => {
console.log(x);
});
但是当obs1出错时,obsError2也会被执行
我不知道处理错误的最佳方法
【问题讨论】:
-
那是因为你抛出了obsError1,如果你返回of()它会继续流2而不抛出。
-
如果我不抛出错误,它将运行 obs2
-
是的,这是预期的行为,你到底想做什么
标签: javascript rxjs angular-observable