[英]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.