Вызов обещания разрешается несколько раз, возвращая одни и те же старые результаты. - PullRequest
0 голосов
/ 02 октября 2019

В моем угловом проекте у меня есть два отдельных компонента.

parent.component.ts

mypromise = this.httpClient.get<any>('http://localhost').toPromise()

parent.component.html

<app-children #child [promise]="mypromise"></app-children>

<button (click)="child.update()">Update now!</button>

child.component.ts

@Input promise: Promise<any>

ngOnInit(){
  this.getMyPromise()

  //results:
  //[{id: 1, text: 'abc'}, {id: 2, text: 'abcd'}]  
}

update(){
  this.getMyPromise()
  //expected:
  //[{id: 1, text: 'abc'}, {id: 2, text: 'abcd'}, {id: 3, text: 'new data'}]  

  //results:
  //[{id: 1, text: 'abc'}, {id: 2, text: 'abcd'}]
  //same outdated results of first call
}

getMyPromise(){
 this.promise
 .then(data=>console.log(data)) //here i log my results in console
 .catch(e=>console.log(e))
}

Когда мой компонент запускается, обещание обычно разрешается с моим контентом, но если я вызываю свое обещаниеснова используя функцию update в кнопке Update now!, после обновления моих данных в бэкенде обещание вернет те же результаты первого вызова в ngOnInit()

Как я могу вызвать обновленные данные в своем бэкэнде, используяэто же обещание? Это возможно?

Ответы [ 2 ]

0 голосов
/ 02 октября 2019

Вы всегда получаете один и тот же результат, потому что больше не вызываете de server.

Для того, чтобы ваш код работал так, как вы ожидаете, вам нужно реализовать больше строк кода, подобных этому:

parent.component.ts

public mypromise;
    ngOnInit() {
     mypromise = this.getSomethig();
    }

    public function getSomething() {
     return this.httpClient.get<any>('http://localhost').toPromise();
    }

child.component.ts

@Input() promise: Promise<any>
@Output() getSomething = new EventEmitter<any>();

ngOnInit(){
 this.promise
 .then(data=>console.log(data)) //here i log my results in console
 .catch(e=>console.log(e))

 //results:
 //[{id: 1, text: 'abc'}, {id: 2, text: 'abcd'}]  
}

update(){
     this.getSomething.emit();
}

Подробнее об источнике событий см. В https://dzone.com/articles/understanding-output-and-eventemitter-in-angular

0 голосов
/ 02 октября 2019

Обещание - это односторонний конечный автомат, поэтому после его разрешения он останется таким навсегда. Вы не можете это изменить. Только когда он находится в состоянии pending, вы можете разрешить его с помощью значения. Попытка вызова resolve() снова на обещании, которое не находится в состоянии pending, просто игнорирует вызов (ничего не делает).

Как я могу вызвать обновленные данные в моем бэкэнде, используя этот жеобещают? Это возможно?

Вам нужно будет снова вызвать исходную асинхронную операцию:

this.httpClient.get<any>('http://localhost').toPromise()

, чтобы получить новое обещание, связанное с новым асинхронным действием, чтобы получить новоеданные. Это новое обещание будет разрешено с новыми данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...