typescript - angular 2'de subscribe metodundan sonra değişken null oluyor


Bileşenimde bir servisi çağırma konusunda bir sorunum var, bu yüzden veriler her zaman null oluyor. İşte örnek:

hizmet yöntemi :

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

bileşendeki yöntem :

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);
  }

subscribe yönteminin içinde currentUser'ı teselli etmeye çalışmak:

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

ama başka bir örnek olan nesne null oluyor ve ayrıca subscribe’tan currentUser’ı console’a yazdırmaya çalıştığında da null oluyor..

Lütfen, sorun nedir?

Cevap #1

anotherInstance o fonksiyona özgüdür. Ona bir referansınızın olmasını istiyorsanız, bu kapsamın dışında deklarasyon yapmanız gerekir.

subscribe yöntemi asenkron çalışır. anotherInstance'i currentUser'e atıyorsunuz, ancak o anda currentUser sadece bir new User()’dır; Fonksiyon tamamlandığında ise undefined olacaktır.

Değişkenlerinizi uygun şekilde kapsamlandırın ve veriyi gerçekten elinizde bulundurduğunuzda değerlerini ayarlayın:

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)
    );
  }

O zaman anotherInstance, sınıfınızın bir özelliği olacak ve updateParameter metodunun dışında erişilebilir olacaktır.