Я использую Angular / RxJS в течение нескольких недель и имею различные модели, построенные из нескольких запросов REST, которые я до сих пор достигал с помощью switchMap ().Вот простой надуманный пример (stackblitz: https://stackblitz.com/edit/angular-o1djbb):
import { Component, OnInit, } from '@angular/core';
import { Observable, of } from 'rxjs';
import { delay, switchMap } from 'rxjs/operators';
interface Order {
id: string;
itemName: string;
details?: string;
}
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
order: Order;
ngOnInit() {
this.getOrderFromApi(123)
.subscribe(item => this.order = item);
}
getOrderFromApi(id): Observable<Order> {
const item$ = this.getItemName(id);
const fullItem$ = item$.pipe(
switchMap(n => {
console.log(`Got name: '${n}''`);
return this.getDetails(n);
},
(nameReq, detailsReq) => ({ id: '123', itemName: nameReq, details: detailsReq })
));
return fullItem$;
}
getItemName(id): Observable<string> {
return this.fakeXhr('foo');
}
getDetails(itemName): Observable<string> {
console.log(`Got details '${itemName}''`)
return this.fakeXhr('Some details about foo');
}
fakeXhr(payload: any) {
return of(payload)
.pipe(delay(2000));
}
}
и простой шаблон:
<p>
item: {{order && order.itemName}}
</p>
<p>
details: {{order && order.details}}
</p>
Это работает, но информация о заказе не отображается, пока оба *Выполнено 1009 * запросов. Я хотел бы, чтобы itemName отображался как только он становился доступным, а затем детали отображались, когда они становились доступными, и, следовательно, использовали многочисленные значения, которые могут генерировать Observables.Например:
// first value emitted:
{ itemName: 'foo', details: null }
// second value emitted:
{ itemName: 'foo', details: 'Some details about foo' }
Я понимаю, что, вероятно, смог бы достичь этого с помощью BehaviourSubject или с помощью Redux (как я это делал в прошлом с React), но чувствую, что есть простое решение, которое я не совсем понимаю из-зановизна всего этого для меня.