Ждать внутренних подписок внутри карты?

Когда я пытаюсь подписаться внутри функции map, наблюдаемый объект не ждет выполнения внутренних подписок.

У меня есть следующее:

        return this.http.get(url).map((project)=>{       
             // replace pilot id by pilot object 
             this.UserService.retrieveObject(project.pilot).subscribe(pilot => { 
                 project.pilot = pilot,
             })

             //replace owner id by owner object
             this.UserService.retrieveObject(project.owner).subscribe(owner => { 
                 project.owner = owner,
             })
             return project;
         });

возвращаемый объект project содержит идентификаторы владельца и пилота вместо объектов, поскольку он не ожидает подписки.

Как сделать так, чтобы наблюдаемые дождались завершения всех внутренних подписок?


person a bsss    schedule 09.03.2018    source источник
comment
stackoverflow.com/ вопросы/40788163/   -  person Dionisis K    schedule 09.03.2018


Ответы (1)


Вам нужно будет значительно реорганизовать это.

Вы можете использовать forkJoin, чтобы дождаться завершения обоих Observables, а затем использовать его функцию «проекции» для обновления объекта project:

return this.http.get(url)
    .mergeMap(project => Observable.forkJoin(
        this.UserService.retrieveObject(project.pilot),
        this.UserService.retrieveObject(project.owner),
        (pilot, owner) => {
            project.pilot = pilot;
            project.owner = owner
            return project;
        }
    ));
person martin    schedule 09.03.2018
comment
Одна вещь, на которую стоит обратить внимание, — это поведение при ошибке: если какой-либо из подзапросов завершается неудачей, вся цепочка завершается ошибкой. - person Ingo Bürk; 09.03.2018
comment
Я люблю тебя, чувак, я бы никогда не догадался о роли последнего параметра forkJoin без твоего ответа. ТЫ ВМ - person a bsss; 09.03.2018
comment
@IngoBürk Как сделать так, чтобы он выполнялся, даже если один запрос не удался? - person a bsss; 09.03.2018
comment
Вы можете добавить .catch(…) к запросам внутри forkJoin для обработки ошибок в отдельных подзапросах. - person Ingo Bürk; 09.03.2018