Saya memiliki metode yang membuat timer:

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

Kemudian timer ini saya tambahkan ke array this.timers dari Observables:

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

Ketika saya menggabungkan pengamat:

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

Saya melihat bahwa console.log(x); terus bekerja meskipun penghitung waktu telah selesai.

Mengapa? Dan bagaimana cara menghentikan semua penghitung waktu dalam array?

Saya dapat berhenti berlangganan di sini:

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

Tapi itu tidak berhenti Observable.merge.

0
user11314257 29 Oktober 2019, 01:01

1 menjawab

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

Dalam hal ini mergeObserver bukan yang dapat diamati tetapi berlangganan. Metode berlangganan mengembalikan langganan. Jadi, mengganti nama ini menjadi mergeSubscription dan memanggil unsubscribe pada objek ini adalah cara berhenti berlangganan.

Jika Anda menginginkan referensi ke yang dapat diamati, Anda harus berlangganan setelah Anda mengambil referensi.

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

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

Dan kemudian Anda berhenti berlangganan dengan objek mergeSubscription.

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

Di sini Anda tidak dapat memanggil berhenti berlangganan pada x karena x adalah nilai yang keluar dari penghitung waktu yang digabungkan. Ketika salah satu timer mengeluarkan maka merge akan mengeluarkan nilai tersebut juga, itu hanya angka dan tidak memiliki metode unsubscribe.

1
Adrian Brand 28 Oktober 2019, 22:55