Fiz um código para monitorar um Mapa usando o nativescript-geolocation e o nativescript-google-maps-sdk, há um serviço do Angular que encapsula toda a lógica de acesso ao nativescript-geolocation que recebe um subscribe fornecido por um comente do Angular.
Ao executar o listener representado pela função componente.mapViewRead()
, que é executado quando o mapa está pronto, este cadastra no serviço o subscribe chamando um método servico.gpsInfo$ .subscribe((gpsInfo)=>this.gpsInfo = gpsInfo)
, quando o usuário manipula o mapa mudando a posição da camera para uma nova coordenada, uma propriedade que representa o subscripition é usada por outro listener responsável pela manipulação da camera para desativar o subscribe chamando a função this.subscription.unsubscribe()
.
Apesar da subscrição ser desativada teóricamente e poder ser constado através da propriedade this.subscription.isClosed
, ele não para de processar as chamadas do Observable.
Será que eu estou fazendo algo errado? ou é um bug do RXJS?
Abaixo está o código de ambos serviço e componente.
Neste link pode ser encontrado o código completo do serviço, e abaixo o código relevante ao problema.
startHeadingUpdates() { if (this.watchId) { return; } this.watchId = geoLocation.watchLocation( (loc) => { if (loc) { this._gpsInfo.next(<GPSInfo>loc); } }, (e) => { console.error("Error: " + e.message); }, { desiredAccuracy: 3, updateDistance: 10, minimumUpdateTime: 1000 * .3 }); } public get gpsInfo(): Observable<GPSInfo> { if (!this._gpsInfo$ ) this._gpsInfo$ = this._gpsInfo.asObservable() return this._gpsInfo$ ; }
Código completo do componente pode ser encontrado neste link, abaixo apenas o código relevante ao problema:
// componente private subscribeGPSInfo() { this._gpsInfoSubscription = this._compass.gpsInfo.subscribe((gpsInfo) => { this.gpsInfo = gpsInfo; }, (error) => { console.error("MussalaMapsComponent.ngAfterViewInit() _compass.gpsInfo.subscribe ", error); }); } private unsubscribeGPSInfo() { if (this._gpsInfoSubscription && this._gpsInfoSubscription.closed) { this._gpsInfoSubscription.unsubscribe(); } } goToMyLocation() { const cfg: GPSConfig = {}; this._compass.getMyLocation(cfg) .then((gpsInfo: GPSInfo) => { this.gpsInfo = gpsInfo; this.mapView.latitude = this.gpsInfo.latitude; this.mapView.longitude = this.gpsInfo.longitude; }); this.subscribeGPSInfo(); } onMapReady(event) { const template = this.createInfoWindowTemplate(); this.mapView.infoWindowTemplates = template; let marker: Marker = this._compass.createIslamicMarker( 1, MakerType.MUSSALA, "Mussala Fortaleza", "Fortaleza, Ce, Brasil", "Rua São Paulo, 1831 - Jacarecanga, Fortaleza - CE, 60310-226", //-3.7214696,-38.5430259 <GPSInfo>{ latitude: -3.7214696, longitude: -38.5430259 } ); this.mapView.addMarker(marker); marker = this._compass.createIslamicMarker( 2, MakerType.SPONSOR, "Curso Arduino Minas", "Aquiraz, Ce, Brasil", "R. José Alves Pereira, S/N, Aquiraz, CE, Brasil", { latitude: -3.9242100850690402, longitude: -38.45365650951862 } ); this.mapView.addMarker(marker); this.goToMyLocation(); this.subscribeGPSInfo(); this.isBusy = false; }