मेरे पास एक तरीका है जो टाइमर बनाता है:

 create(options: any) {
    return timer(0, 1000).pipe(
      map(() => {
        return options;
      }),
      takeWhile(() => new Date() < options.finishDate)
    );
  }

फिर इस टाइमर को मैं वेधशालाओं के सरणी this.timers में जोड़ता हूं:

this.timers.push(this.create({finishDate: new Date()}))

जब मैं पर्यवेक्षकों का विलय करता हूं:

this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

मैं देख रहा हूँ कि console.log(x); टाइमर समाप्त होने के बावजूद काम करना जारी रखता है।

क्यों? और सरणी में सभी टाइमर कैसे रोकें?

मैं यहां सदस्यता समाप्त कर सकता हूं:

 Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

लेकिन यह Observable.merge नहीं रुकता।

0
user11314257 29 अक्टूबर 2019, 01:01

1 उत्तर

सबसे बढ़िया उत्तर
this.mergeObserver = Observable.merge(this.timers).subscribe(x => {
   console.log(x);
});

इस मामले में mergeObserver एक अवलोकन योग्य नहीं बल्कि एक सदस्यता है। सदस्यता विधि सदस्यता लौटाती है। तो इसका नाम बदलकर मर्ज सब्सक्रिप्शन और इस ऑब्जेक्ट पर अनसब्सक्राइब कॉल करना है कि कैसे अनसब्सक्राइब किया जाए।

यदि आप अवलोकन योग्य संदर्भ चाहते हैं तो आपको संदर्भ लेने के बाद सदस्यता लेने की आवश्यकता है।

this.mergeObserver = Observable.merge(this.timers);

this.mergeSubscription = this.mergeObserver.subscribe(x => {
   console.log(x);
});

और फिर आप मर्जसब्सक्रिप्शन ऑब्जेक्ट के साथ सदस्यता समाप्त करें।

Observable.merge(this.timers).subscribe(x => {
   x.unsubscribe();
});

यहां आप एक्स पर अनसब्सक्राइब को कॉल नहीं कर सकते क्योंकि एक्स वह मान है जो मर्ज किए गए टाइमर से निकलता है। जब टाइमर में से कोई एक निकलता है तो मर्ज उस मान को भी छोड़ देगा, यह केवल एक संख्या है और इसमें सदस्यता समाप्त करने की विधि नहीं है।

1
Adrian Brand 28 अक्टूबर 2019, 22:55