subscribe nadanie wartości

0

Cześć mam taki kod :)

 user: UserDetails;
  constructor(
    private authService: AuthService,
    private conversationService: ConversationService
  ) {
    this.authService.getUserDetails.subscribe(x => {
      this.user = x;
      console.log(this.user) //Wartość poprawana
  });

  console.log(this.user) // Wartość nie poprawna

  }

  ngOnInit(): void {
    this.authService.getUserDetails.subscribe(x => {
        this.user = x;
        console.log(this.user) //Wartość poprawana
    });

    console.log(this.user) // Wartość nie poprawna
  }

Dlaczego po za klamry subscription this.user jest nullem jeżeli nadaje jej wartość w subscription :/

1

subscribe() jest asynchroniczne - oznacza to, że przekazana doń funkcja nie musi być uruchomiona od razu, a dopiero kiedyś w przyszłości (wtedy, gdy dana wartość stanie się dostępna):

this.authService.getUserDetails.subscribe(x => {
    this.user = x;
    console.log('2', this.user);
});

console.log('1', this.user);

Ten kod wypisze 1, null i dopiero potem (może to być i milisekundę później, lecz później) 2, obiekt użytkownika.

0

@Patryk27: Co mogę zrobić aby pierw wykonało się przekazanie wartości a następnie console.log ? :)

0

Mógłbyś zrobić swój konstruktor asynchronicznym, coś w stylu:

class SomeClass {
    static async build(
        authService: AuthService, 
        conversationService: ConversationService
    ) {
        const self = new SomeClass();

        self.user = await authService.getUserDetails.subscribe().toPromise();

        return self;
    }
}

I następnie zamiast new SomeClass(), to:

const someClass = await SomeClass.build(..., ...);

1 użytkowników online, w tym zalogowanych: 0, gości: 1