Не могу использовать результат от подписки угловой - PullRequest
0 голосов
/ 01 февраля 2019

Я следую этому руководству и пытаюсь сделать что-то похожее на Несвязанные компоненты: обмен данными со службой параграф

Служба данных:

 @Injectable()
export class MyDataService{

  private messageSource = new BehaviorSubject(null);
  currentMessage = this.messageSource.asObservable();

  constructor(private http: HttpClient) {
    setInterval(() => { this.changeMessage(this.resultFromRestCall()); }, 10 * 1000);
  }

  changeMessage(message: object) {
    this.messageSource.next(message);
  }

  resultFromRestCall(){
    const json;
    this.http.get<object>(myApiUrl).subscribe(res => 
       json['data'] = res['data'] //this is an example
    );
    return json;
  }

Компонент:

export class MyComponent implements OnInit {

  constructor(private dataservice: MyDataService) {}

  ngOnInit() {
    this.dataservice.currentMessage.subscribe(
      message => {this.handleVarChange(message); }
    );
  }

  handleVarChange(message) {
    console.log(message.data);
  }
  • С этим кодом я получил "undefined" в handleVarChange log

  • Вместо того, чтобы звонить this.handleVarChange(message); при подписке, я пишу console.log (сообщение), я правильно получил свой результат.

  • Итак, мой вопрос:Можно использовать значение, полученное от службы данных, в какой-то функции моего компонента.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

С:

resultFromRestCall(){
  const json;
  this.http.get<object>(myApiUrl).subscribe(res => 
     // takes x amount of time to populate json
     json['data'] = res['data'] //this is an example
  );
 // executed instantly after above request has been called 
 return json;
}

Вы возвращаете json до того, как будет заполнено, так как запрос асинхронный.

Вместо этого вы можете перевернуть егонемного, и сначала вызовите resultFromRestCall(), а когда получите ответ, , затем вызов changeMessage():

setInterval(() => { 
  this.resultFromRestCall().subscribe((data) => {
    this.changeMessage(data);
  });
}, 10 * 1000);

, где resultFromRestCall просто возвращает наблюдаемое:

resultFromRestCall(){
  return this.http.get<object>(myApiUrl);
}

Также не забудьте clearInterval в OnDestroy!

DEMO

0 голосов
/ 01 февраля 2019

Пропустить .data in handleVarChange:

Вместо

handleVarChange(message) {
  console.log(message.data);
}

записать

handleVarChange(message) {
  console.log(message);
}
...