Итак, проблема в том, что вы вызываете две асинхронные функции (subscribes
, которые делают HTTP-запросы) синхронно. Это означает, что к тому времени, когда вы получите звонки this.f(...)
и console.log
, ваши http-звонки могут или могут еще не завершиться .
Решение состоит в том, чтобы объединить ваши подписки в одну функцию и вызвать this.f(...)
и console.log
внутри обратного вызова подписки. Вы можете использовать либо RxJS ОбъединитьЛастест , либо forkJoin . Я использовал forkJoin
в своем ответе, потому что http наблюдаемые завершены.
Вот стекблитц с рабочим кодом (был удален файл user.service.ts). https://stackblitz.com/edit/angular-zvfsft
В Offra.component.ts
// beginning of file...
/* I recommend moving your logic to ngOnInit */
ngOnInit() {
// You need to combine your two calls
// you can use combineLatest or forkJoin
forkJoin(
this.service.getAllOffer(),
this.service.getServices(),
).subscribe(([offres, services]) => {
this.offres = offres;
this.services = services;
this.f(this.offres, this.services);
console.log(this.countList);
});
}
// rest of file...
Основное различие между forkJoin
и combineLatest
:
forkJoin
требует, чтобы все наблюдаемые были завершены перед передачей значений подписчику. Это считается "холодной" наблюдаемой, потому что она будет излучать только один раз.
combineLatest
требует, чтобы все наблюдаемые испускали хотя бы один раз , прежде чем передать какие-либо значения подписчику. У него есть другое отличное поведение, но суть в том, что это обычно возвращает горячую наблюдаемость. Вы можете прочитать документы по этому вопросу, если хотите узнать больше.
Надеюсь, это работает для вас. Ура!