Angular Observables, подписка на несколько HTTP-запросов, без цепочки

Мне нужна помощь в отношении Observables с Angular.

export class Car implements OnInit {
    exterior: Exterior;
    engine: Engine;

    ngOnInit(): void {
        this.getContent();
    }

    getContent() {
        this.exterior.getContent();
        this.engine.getContent();
    }
}

export class Exterior {
    color: string;
    doors: number;

    getContent() {
        this.http.get('url').map((response) => {
            this.color = response.color;
            this.doors = response.doors;
        });
    }
}

export class Engine {
    horsePower: number;
    model: string;

    getContent() {
        this.http.get('url').map((response) => {
            this.horsePower = response.horsePower;
            this.doors = response.doors;
        });
    }
}

const car = new Car();
console.info(car);

Итак, у меня есть эти 3 объекта, и я хочу, чтобы когда я вызываю new Car (), он заполняет параметры. Затем я хочу создать log для этого автомобильного объекта после выполнения всех HTTP-запросов, что означает, что оба getContents из Exterior и Engine были завершены, что будет означать, что getContents из Car был завершен, и, наконец, ngOnInit. Я не хочу связывать эти HTTP-запросы, то есть вызывать только второй HTTP-запрос после завершения первого. Оба должны погаснуть одновременно.

Есть идеи, как это реализовать?

forkJoin?
Ric 30.11.2018 16:25
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя RxJs, вы должны попробовать что-то вроде этого:

    export class Car implements OnInit {

        exterior: Exterior;
        engine: Engine;

        ngOnInit(): void {
            this.getContent();
        }

        getContent(): Observable<any> {

           return forkJoin(this.exterior.getContent(), this.engine.getContent());

          }
    }

Внутри другого компонента:

...
this.car.getContent().subscribe(
              results => {
                 let exterior = result[0];
                 let engine = result[1];
                 // Do whatever you want here
              });
          )
...

Это также подразумевает, что оба ваших метода exterior.getContent() и engine.getContent() должны возвращать Observable данных, которые вы хотите использовать.

хорошо, но я хочу слушать от другого компонента, это означает, что getContent of Car должен возвращать наблюдаемый. ngOnInit возвращает void, поэтому мне нужно вызвать getContent из другого компонента, но как заставить getContent возвращать наблюдаемое?

Gabb1995 30.11.2018 16:52

Я обновил свой первый пост, просто верните результат forkJoin и подпишитесь на него, когда и где захотите :)

rguerin 30.11.2018 16:58

Другие вопросы по теме