मुझे निश्चित रूप से यहाँ कुछ याद आ रहा है; मेरे पास एक कोणीय घटक है जो इस तरह दिखता है:

@Component({
  selector: 'lobby',
  templateUrl: './lobby.component.html',
  styleUrls: ['./lobby.component.scss'],
  providers: [LobbyService, LobbyUsersService, LobbyActivityService]
})

इसमें घटक में प्रदान की गई 3 सेवाएं हैं, जो दस्तावेज़ों के अनुसार, घटक के साथ नष्ट हो जाती हैं।

सेवाओं में से एक में मुझे एक देखने योग्य सदस्यता मिली है:

@Injectable()
export class LobbyUsersService { 
        
constructor(private _http: HttpClient, private _socketioService: SocketioService) {this._url = environment.url;
}
        
subscribe() {   
     this._socketioService.socketIoConnectObs.subscribe((connect: boolean) => {
        if (connect) {
           ....
           ....
        }
     });
}

इस घटना के प्रकाशक को सिंगलटन सेवा में इस तरह घोषित किया गया है:

@Injectable({
  providedIn: 'root'
})
export class SocketioService {

    private _socketIoConnectSubject: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(null);
    public socketIoConnectObs: Observable<boolean> = this._socketIoConnectSubject.pipe(filter(val => val !== null));
    ....
    ....
    this._socket.on('connect', () => {
        this._socketIoConnectSubject.next(true);
    });
}

मेरा प्रश्न यह है कि 'लॉबी' घटक के नष्ट हो जाने के बाद भी सेवा की सदस्यता LobbyUsersService को क्यों कॉल की जा रही है और मुझे वर्तमान में किसी अन्य घटक पर भेजा गया है?

0
Shalashka 20 अक्टूबर 2020, 22:54

1 उत्तर

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

आपको अपने LobbyUsersService में सदस्यता का प्रबंधन करना होगा और सेवा के नष्ट होने पर सदस्यता समाप्त करनी होगी। आप अपने LobbyUsersService को OnDestroy लागू करके ऐसा कर सकते हैं।

import { Injectable, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';

@Injectable()
export class LobbyUsersService implements OnDestroy {

  private _socketIOSubscription: Subscription;
        
  constructor(
    private _http: HttpClient, 
    private _socketioService: SocketioService
  ) {
    this._url = environment.url;
  }
        
  subscribe() {   
    this._socketIOSubscription = this._socketioService.socketIoConnectObs
      .subscribe((connect: boolean) => {
        if (connect) {
          ....
          ....
        }
      });
  }

  ngOnDestroy() {
    if (this._socketIOSubscription) {
      this._socketIOSubscription.unsubscribe();
    }
  }
}

https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0

3
Jason White 20 अक्टूबर 2020, 20:19