当我在 rxjs 管道中出错时如何取消订阅?
How to do `unsubscribe` when I got error in the pipeline of rxjs?
当我在管道中遇到错误时unsubscribe
怎么办?
我在 doWork
函数之外订阅了 subjectPipe
管道。
在 doWork
函数中我抛出了一个错误(可以作为我的逻辑流程的一部分)。
一切都按预期工作,但 subjectPipe
是日志:“主题错误”,因为我使用 take(1)
我认为它应该取消订阅,但它不会发生,因为完整的功能没有被调用.
发生错误时如何unsubscribe
?
我唯一能想到的就是创建变量 error$
并使用 takeUntil
然后在错误函数上调用 error$
。但我不想这样做,因为它是额外的变量,如果我对每种情况都这样做,代码会很乱。
import { Subject, throwError } from 'rxjs';
import { map, switchMap, take, tap } from 'rxjs/operators';
console.clear();
const doWork = () => {
const subject = new Subject();
const work = () => {
throw new Error('bla');
};
const subjectPipe = subject.pipe(
tap(() => {
console.log('in subject pipeline');
}),
switchMap(() => work())
);
subjectPipe.subscribe({
next: () => console.log('in subjectPipe next'),
error: () => console.log('in subjectPipe error'),
complete: () => console.log('in subjectPipe complete'),
});
return { subject, subjectPipe };
};
const { subject, subjectPipe } = doWork();
subjectPipe
.pipe(
take(1),
tap(() => console.log('continue the pipe...'))
)
.subscribe({
next: () => console.log('in subject next'),
error: () => console.log('in subject error'),
complete: () => console.log('in subject complete'),
});
subject.next(null);
错误意味着完成(但是,与 complete
关联的回调永远不会被调用)。因此,此处无需手动从流中 unsubscribe
。
在你的情况下,如果你需要在完成和错误中调用一些逻辑,你可以使用 RxJS finalize 运算符,它会在两种情况下调用。
subjectPipe
.pipe(
take(1),
tap(() => console.log('continue the pipe...')),
finalize(() =>
console.log(
'You can do the final stuff here, instead of `complete` callback'
)
)
)
.subscribe({
next: () => console.log('in subject next'),
error: () => console.log('in subject error'),
complete: () => console.log('in subject complete'),
});
当我在管道中遇到错误时unsubscribe
怎么办?
我在 doWork
函数之外订阅了 subjectPipe
管道。
在 doWork
函数中我抛出了一个错误(可以作为我的逻辑流程的一部分)。
一切都按预期工作,但 subjectPipe
是日志:“主题错误”,因为我使用 take(1)
我认为它应该取消订阅,但它不会发生,因为完整的功能没有被调用.
发生错误时如何unsubscribe
?
我唯一能想到的就是创建变量 error$
并使用 takeUntil
然后在错误函数上调用 error$
。但我不想这样做,因为它是额外的变量,如果我对每种情况都这样做,代码会很乱。
import { Subject, throwError } from 'rxjs';
import { map, switchMap, take, tap } from 'rxjs/operators';
console.clear();
const doWork = () => {
const subject = new Subject();
const work = () => {
throw new Error('bla');
};
const subjectPipe = subject.pipe(
tap(() => {
console.log('in subject pipeline');
}),
switchMap(() => work())
);
subjectPipe.subscribe({
next: () => console.log('in subjectPipe next'),
error: () => console.log('in subjectPipe error'),
complete: () => console.log('in subjectPipe complete'),
});
return { subject, subjectPipe };
};
const { subject, subjectPipe } = doWork();
subjectPipe
.pipe(
take(1),
tap(() => console.log('continue the pipe...'))
)
.subscribe({
next: () => console.log('in subject next'),
error: () => console.log('in subject error'),
complete: () => console.log('in subject complete'),
});
subject.next(null);
错误意味着完成(但是,与 complete
关联的回调永远不会被调用)。因此,此处无需手动从流中 unsubscribe
。
在你的情况下,如果你需要在完成和错误中调用一些逻辑,你可以使用 RxJS finalize 运算符,它会在两种情况下调用。
subjectPipe
.pipe(
take(1),
tap(() => console.log('continue the pipe...')),
finalize(() =>
console.log(
'You can do the final stuff here, instead of `complete` callback'
)
)
)
.subscribe({
next: () => console.log('in subject next'),
error: () => console.log('in subject error'),
complete: () => console.log('in subject complete'),
});