簡體   English   中英

rxjs發生錯誤后如何運行主題?

[英]How to run subject after error happens in rxjs?

為什么subject.next(2); 不工作? 我知道這可能是因為信號流出錯了。 但是我添加catchError並在管道中返回一個EMPTY並使其完成。

所以似乎catchError也沒有幫助我。

如何使subject.next(2)有效?

我的代碼正在調用doWork函數。 在里面我調用work函數。 如果它是一個我在第一次調用函數時模擬錯誤,之后就不應該有錯誤。

然后我公開主題和主題管道,以便在調用管道后執行其他操作。 我為此使用share (不重復我的流程),它應該只發生一次。

stackblitz.com

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);

這里有幾件事:

  1. 一個subject是一個主題
  2. doWork函數中的pipe 這樣的pipe實際上是與subject不同的對象。 它是在subject上調用的pipe函數返回的 Observable。 subjectpipe的來源,但它不是pipe
  3. 給定work功能邏輯,處理第一個通知時出現pipe錯誤
  4. 訂閱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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM