Не могу получить значение в ngoninit при подписке angular

Я не понимаю, почему мой объект всегда "undefinned" на ngoninit на angular. Я запрашиваю свой api-проект, я получаю свой ответ правильно. Когда я console.log, мой объект не определен (ngoninit), но в другой функции я могу получать значения.

Мои вопросы: почему и как я могу получить свой объект в ngoninit.

Спасибо

Я правильно получаю свой ответ на почтальоне, другие функции тоже извлекают

Услуга:

getById(id:string):Observable<Grower>{
   return this.http.get<Grower>(`${environment.apiUrl}/growers/${id}`);
}

Посмотреть модель:

export class GrowerDetails {

    adress:string;
    zip:string;
    city:string;
}

Составная часть:

  growerService:GrowerService;

  detailsProfil: GrowerDetails;

  constructor(private authenticationService: AuthenticationService, growerService:GrowerService,
    private formBuilder:FormBuilder) { 
      this.growerService = growerService;
   }

  ngOnInit() {
    this.detailsProfil = new GrowerDetails();

    this.growerService.getById(this.decoded.nameid).subscribe(
      (data:Grower) => this.detailsProfil = {
            adress: data.adress,
            city: data.city,
            zip : data.zip

      },
      error => console.log(error) 
    );
console.log(this.detailsProfil); // undefinned

onSubmit(){
    console.log(this.detailsProfil); // ok
 }

Почтальон:

{
    "lat": 0,
    "long": 0,
    "description": "test",
    "adress": "test",
    "zip": "test",
    "city": "test"
}

person Devozor92    schedule 11.01.2019    source источник
comment
Возможный дубликат https://stackoverflow.com/questions/43055706/how-do-i-return-the-response-from-an-observable-http-async-call-in-angular2   -  person ConnorsFan    schedule 11.01.2019
comment
поскольку ваша подписка является асинхронной, вы можете использовать консоль внутри подписки, вы увидите данные   -  person fsi    schedule 11.01.2019
comment
как я могу это сделать?   -  person Devozor92    schedule 11.01.2019
comment
это значит, что я не могу работать со своим объектом вне подписки в ngoninit?   -  person Devozor92    schedule 11.01.2019
comment
Снаружи - да, но после выполнения наблюдаемого обратного вызова. Если вы сохраните два оператора console.log, вы увидите, что исходный оператор вызывается перед обратным вызовом подписки. См. Дублирующийся вопрос / ответ для получения более подробной информации.   -  person ConnorsFan    schedule 11.01.2019


Ответы (2)


Мы можем иметь значение detailsProfil внутри подписки, но не за ее пределами. Поскольку getById () является асинхронным вызовом, он не будет ждать завершения подписки, прежде чем он выполнится.

Сделайте некоторые изменения, как показано ниже,

 constructor(private authenticationService: AuthenticationService, growerService:GrowerService,
    private formBuilder:FormBuilder) { 
      //  this.growerService = growerService;  <- this line not required
   }

  ngOnInit() {
    this.detailsProfil = new GrowerDetails();

    this.growerService.getById(this.decoded.nameid).subscribe((data) => {
       console.log(data);            
       this.detailsProfil.adress = data.adress;
       this.details.city = data.city;
       this.details.zip = data.zip;
     },
      error => console.log(error));
     console.log(this.detailsProfil); // you will get detailsProfil Object
  }

Удачного кодирования .. :)

person Ganesh    schedule 11.01.2019
comment
ок, это работает. я не знаю, почему в документе говорится так: .subscribe ((data: Config) = ›this.config = {heroesUrl: data ['heroesUrl'], textfile: data ['textfile']}); - person Devozor92; 11.01.2019

Он не определен, потому что у вас еще нет данных.

     ngOnInit() {
        this.detailsProfil = new GrowerDetails();

        this.growerService.getById(this.decoded.nameid).subscribe(
          (data:Grower) => {
             this.detailsProfil = {adress: data.adress,city: data.city,zip : data.zip };

             console.log(this.detailsProfil); // you can access here because you got it now.
          },
          error => console.log(error) 
        );

    console.log(this.detailsProfil); // you can't access here. it's still undefined 
  }
person Must.Tek    schedule 11.01.2019