В моем html я использую асинхронный канал для подписки на наблюдаемое, как показано ниже.
<button (click)="getData(1)" >getUser1</button>
<button style="margin:50px;" (click)="getData(2)" >getUser2</button>
<div>------------------------------------------</div>
<div *ngIf="userData$ |async as user">
data is{{ user | json}}</div>
и этот наблюдаемый userData $ становится новым каждый раз, когда пользователь нажимает кнопку 1 или 2.
getData(id) {
this.userData$ = this.getDataFromBackend(id);
}
getDataFromBackend(id) {
//delay added to simulate network delay
// fake backend call but i have to use real one in actual project
return of(this.dataSource[id]).pipe(delay(1000));
}
теперь всякий раз, когда пользователь переходит с user1 на user2, назначается новая наблюдаемая. и поскольку этой новой наблюдаемой требуется некоторое время, чтобы получить данные, на данный момент она пуста.
можем ли мы сделать что-нибудь так, чтобы до тех пор, пока не вернутся новые наблюдаемые данные, мы могли бы отображать предыдущие данные.
I can not user loader here meanwhile.
I know i can do something like
let subject = new Subject();
let userObservable$ = subject.asObservable()
and use this observable in the html
and the subscribe to these observable form getDataFromBackend() here in the class and from
subscription do the subject.next() and it will send the updated value
but this does not seem the best way as it do the manual subscription in the component
Ниже приведена ссылка на stackblitz, показывающая проблему.
https://stackblitz.com/edit/angular-ivy-d9nsxu?file=src%2Fapp%2Fapp.component.ts
let user
, а затем превратить запрос в обещание, которое обновляет пользователя по завершении?this.getDataFromBackend(id).toPromise().then( data => (this.user = data))
. Нет необходимости в асинхронном канале, просто отобразите пользователя. - person Z. Bagley   schedule 27.05.2020