[英]How to run subject after error happens in rxjs?
為什么subject.next(2);
不工作? 我知道這可能是因為信號流出錯了。 但是我添加catchError
並在管道中返回一個EMPTY
並使其完成。
所以似乎catchError
也沒有幫助我。
如何使subject.next(2)
有效?
我的代碼正在調用doWork
函數。 在里面我調用work
函數。 如果它是一個我在第一次調用函數時模擬錯誤,之后就不應該有錯誤。
然后我公開主題和主題管道,以便在調用管道后執行其他操作。 我為此使用share
(不重復我的流程),它應該只發生一次。
import { EMPTY, of, Subject, throwError } from 'rxjs';
import { exhaustMap, share, take, tap } from 'rxjs/operators';
console.clear();
const doWork = () => {
const subject = new Subject();
const work = (n) => {
console.log('in work fn', n);
if (n === 1) {
throw new Error('bla');
}
return of([]);
};
const pipe = subject.pipe(
exhaustMap((n) => work(n)),
share()
);
pipe.subscribe({
next: () => console.log('in subjectPipe next'),
error: () => console.log('in subjectPipe error'),
complete: () => console.log('in subjectPipe complete'),
});
return { subject, pipe };
};
const { subject, pipe } = doWork();
pipe
.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(1);
subject.next(2);
這里有幾件事:
subject
是一個主題doWork
函數中的pipe
。 這樣的pipe
實際上是與subject
不同的對象。 它是在subject
上調用的pipe
函數返回的 Observable。 subject
是pipe
的來源,但它不是pipe
work
功能邏輯,處理第一個通知時出現pipe
錯誤pipe
當一個 Observable 出錯時,它會隱式完成,因此它不會通知任何其他值。
pipe
錯誤立即,因此它不會再通知,即使它的來源,即subject
,繼續通知。
因此,您可以執行subject.next(2)
但此通知不會由pipe
處理,因為pipe
已經error
編輯。
還有一件事。 底pipe
中有一個take(1)
。 這意味着我們接受第一個通知,然后我們完成。
因此,即使您刪除引發錯誤的邏輯,您也不會在控制台上看到第二個continue the pipe...
消息,因為 Observable 在第一次通知后完成。
我將擴展@Picci 的回答:
為了解決這樣一個事實,即當發射器(在本例中為Subject
)出錯時它不能再發射,我們可以發射一個Error
實例。 處理此類錯誤將需要更多非標准代碼,但這絕對是給定問題的易於閱讀的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.