繁体   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