Tengo este fragmento de código que se suscribe desde nuestro propio servicio:
Método getVideo()
getVideo() { this.watchService.getVideoByVideoString(this.videoId).subscribe( (Response) => { this.videoData = Response; console.log(Response); }, (err) => console.log(err) ); }Método ngOnInit
ngOnInit() { this.getVideo(); console.log(this.videoData); }Pero la variable por si acaso, this.videoData cuando consuelo.iniciar sesión, regresa como indefinido Oo
Sé que sería un error tonto, pero ¿alguien puede ayudarme?
Gracias
======
Actualizado
Al final, hice algunas pruebas y descubrí que podía manipular los datos dentro de la función, en lugar de manipularlos en NgOnInit
respuesta final quedó así:
getVideo() { this.watchService.getVideoByVideoString(this.videoId).subscribe( (Response) => { this.videoData = Response; if (this.videoData.title == null) { this.titleService.setTitle('InternalVideoChannel'); } else { this.titleService.setTitle('InternalVideoChannel - ' + this.videoData.title); } if (this.videoData.id == 0) { console.log('Video doesnt exist on the database'); this.router.navigate(['/notFound']); } console.log(Response); }, (err) => console.log(err) ); }Gracias !
La sintaxis correcta es
getVideo() { this.watchService.getVideoByVideoString(this.videoId).subscribe( (Response) => { this.videoData = Response; console.log(Response); }, (err) => console.log(err); );}
Bueno, creo que necesitaría un poco más de contexto, la situación es que si tiene un registro de consola antes de que ocurra la suscripción y el valor se asigna a la variable, siempre obtendrá un valor indefinido para this.videoData.
si solo desea ver si el valor se asignó a la propiedad this.videoData de su clase, la consola.log debe estar junto a la asignación en la suscripción.
nota: tenga en cuenta cualquier pérdida de memoria causada por no darse de baja de un observable.
editar: como puede ver, console.log está fuera del alcance de la suscripción, esto significa que no estará definido, una suscripción observable es por naturaleza asíncrona
ngOnInit():void { console.log(this.videoData) <- this will be undefined this.getVideo(); // <- async console.log(this.videoData) <- this will be undefined }la única forma en que puede obtener el valor es consola. iniciar sesión dentro del enlace de suscripción de esta manera:
getVideo() { this.watchService.getVideoByVideoString(this.videoId).subscribe( (Response) => { this.videoData = Response; console.log(Response); console.log(this.videoData); // your console.log }, (err) => console.log(err) );El problema es el comportamiento real de un observable, y el observable se comporta como una promesa, por lo que una vez que ejecute el código, console.log se ejecutará antes de que ocurra la asignación real, si desea ver el valor almacenado en "this.videoData " puede tener una función y vincular esa función a un evento de clic o algo así o simplemente agregar el archivo console.log dentro de la suscripción.
Tercera edición. Bueno, si desea acceder al valor, no hay una solución que yo sepa, pero; si desea acceder al valor en un momento específico de su aplicación.
el enfoque sería crear una función a la que llamaría manualmente cada vez que desee ver el valor, tal vez un tiempo de espera, tal vez en un evento de clic que depende de usted.
logVideoDataValue():void { console.log(this.videoData) }