तो मुझे यह देखने योग्य पाइप मिला है जहां मुझे सदस्यता की शुरुआत में एक बार ऑपरेशन करने की ज़रूरत है, जैसे आप सदस्यता के अंत में एक बार ऑपरेशन करने के लिए 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())
    );
4
Hannes Kindströmmer 15 सितंबर 2020, 13:18

1 उत्तर

सबसे बढ़िया उत्तर

आप प्रत्येक पर कुछ कोड निष्पादित करने के लिए 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())
);
1
frido 15 सितंबर 2020, 14:01