簡體   English   中英

如何在 rxjs 中為每個訂閱在可觀察管道上執行一次初始化邏輯

[英]How to do initialization logic on an observable pipe once per subscription in rxjs

所以我有這個可觀察的管道,我需要在訂閱開始時執行一次操作,就像您可以在訂閱finalize()時使用finalize()執行一次操作一樣

所以這就是我的開始,不幸的是,它會在每次針對主題進行的next()調用中啟動一次。

    const notificationSubject = new BehaviorSubject<Notification | undefined>(undefined);
    const notifications$ = this.notificationSubject.pipe(
      tap(() => startup()),
      filter(isValueDefined),
      finalize(() => shutdown())
    );

   notifications$.subscribe(noti => foo(noti));
   notifications$.subscribe(noti => bar(noti));

然后我們得到了這個變體:

    let isStartedUp = false;
    const internalStartup = () => {
      if(!isStartedUp){
        isStartedUp = true;
        startup();
      }
    }

    const notifications$ = notificationSubject.pipe(
      tap(() => internalStartup()),
      filter(isValueDefined),
      finalize(() => shutdown())
    );

   notifications$.subscribe(noti => foo(noti));
   notifications$.subscribe(noti => bar(noti));

...這是它的工作,但是它做得有點太好了,因為現在啟動只進行一次(並且僅在第一次訂閱時),而不是每個訂閱創建一次。

我想有一些類似的東西,但我還沒有找到。

const notifications$ = notificationSubject.pipe(
      initialize(() => startup()),
      finalize(() => shutdown())
    );

您可以使用defer在每次訂閱時執行一些代碼。

export function initialize<T>(initializer: () => void): MonoTypeOperatorFunction<T> {
  return (source: Observable<T>) => defer(() => {
    initializer();
    return source;
  });
}
const notifications$ = notificationSubject.pipe(
  initialize(() => startup()),
  finalize(() => shutdown())
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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