![](/img/trans.png)
[英]RXJS concat: Ensuring logic in pipe executes before observable completes
[英]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.