Я предполагаю, что все вызовы API сделаны из одного и того же сервиса для простоты. Если нет, вы можете просто создать службу, общую для всех компонентов, и использовать ее. Механизм basi c останется прежним.
Вы можете создать несколько тем, которые будут передаваться в один основной предмет, которым родительский компонент может питаться, используя функцию zip
, чтобы узнать, фоновые звонки окончены. Попробуйте следующее
Общая служба
import { zip } from 'rxjs';
@Injectable()
export class ApiService {
private apiOneStatusSource = new Subject<boolean>();
private apiTwoStatusSource = new Subject<boolean>();
private apiThreeStatusSource = new Subject<boolean>();
private apisStatusSource = new Subject<boolean>();
private apiOneStatus$ = this.apiOneStatusSource.asObservable();
private apiTwoStatus$ = this.apiOneStatusSource.asObservable();
private apiThreeStatus$ = this.apiOneStatusSource.asObservable();
private apisStatus$ = this.apisStatusSource.asObservable();
constructor() {
zip(this.apiOneStatus$, this.apiTwoStatus$, this.apiThreeStatus$).subscribe( // <-- use `zip` to check if all the observables have been emitted
statuses => {
if (statuses.every(status => status === true)) {
this.apisStatusSource.next(true);
}
}
);
}
public setApiOneStatus(status: boolean) {
this.apiOneStatusSource.next(status);
}
public setApiTwoStatus(status: boolean) {
this.apiTwoStatusSource.next(status);
}
public setApiThreeStatus(status: boolean) {
this.apiThreeStatusSource.next(status);
}
public getApisStatus() {
return this.apisStatus$;
}
}
Родительский компонент
ngOnInit() {
this.apiService.getApisStatus.subscribe(
status => {
// api from all 3 child compnents have returned values - proceed further
}
);
}
Дочерние компоненты
this.apiService.componentApiCall().subscribe(
response => {
// handle response
this.apiService.setApiOneStatus(true); // <-- set corresponding status here: setApiTwoStatus for child 2 and so on...
},
error => {
// handle error
this.apiService.setApiOneStatus(false); // <-- set corresponding status here: setApiTwoStatus for child 2 and so on...
);