Búsqueda de sitios web

typescript - la variable se vuelve null después del método subscribe en angular 2


Tengo un problema al llamar a un servicio en mi componente, por lo que los datos siempre se vuelven nulos. Este es el ejemplo:

el método de servicio :

getOneUser() {
    return this._http.get(globals.serverIp + '/user/getOneUser/' + this._ls.getCurrentUserName(), { headers: this.headers})
      .map((response: Response) => <UserParser> response.json());
  }

el método en el componente :

updateParametre(message: string){
    let currentUser = new User();

    this._us.getOneUser().subscribe(
      data =>currentUser = data.data,
      error => console.log('error from updateParam ParamtereComponenet ' + error),
      () => console.log(currentUser)
    );
let anotherinstance : User = currentuser ;
console.log(currentUser);
  }

intentando consolar al currentUser dentro del método subscribe:

    {id: 9,
 initials: "YCI",
 nom: "CHABLI",
 prenom: "Yassin",
 password: "$2a$10$iWVnXs/2TwOk7CBr5RuQ.e/1c/BTlxsvkjHyYrtOgKUiRMll2EupO"}

pero el objeto otra instancia se vuelve nulo, y también al intentar mostrar en la consola el currentUser de la suscripción se vuelve nulo..

¿Cuál es el problema, por favor?

Respuesta #1

anotherInstance está limitado a esa función. Necesitas declararlo fuera de ese alcance para tener una referencia a él.

El método subscribe es asincrónico. Estás asignando anotherInstance a currentUser, pero en ese momento currentUser es solo un new User(); Luego será indefinido cuando la función se complete.

Define el alcance de tus variables de manera adecuada y establece su valor cuando realmente tengas los datos:

anotherInstance: User;

updateParametre(message: string){
    let currentUser = new User();

    this._us.getOneUser().subscribe(
      (data) => { 
         currentUser = data.data,
         this.anotherInstance = currentUser
      }
      (error) => console.log(`error from updateParam ParamtereComponenet: ${error}`),
      () => console.log(currentUser)
    );
  }

Entonces anotherInstance será una propiedad de tu clase y accesible fuera del método updateParameter.