Как получить результат Observer в подписке? - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть два Observable запроса к серверу:

this.initService.__init__(res).subscribe((profile) => {
    console.log(profile); // It works
    this.initService.initializePeriod(profile).subscribe((period) => {
        console.log(period); // It does not work
    });

});

Когда первый получает ответ, он вызывает второй, но я не могу получить результат для второй подписки. Я знаю, что лучше использовать Promises в этом случае, но мне нужно передать результат от первого запроса ко второму, обещания не позволяют сделать это.

Я пытался использовать это, но предупреждающее сообщение не работает:

 this.initService.__init__(res)
            .pipe(
              mergeMap(profile => this.initService.initializePeriod(profile)))
              .subscribe((response) => {
              alert('aa');

});

Также попробовал это:

this.initService.__init__(res)
              .mergeMap(profile => this.initService.initializePeriod(profile))
              .subscribe((response) => {
              alert('aa');
});

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вам необходимо проверить результат, полученный при первом вызове API (профиле). Проверьте консоль браузера. Скорее всего, профиль - это JSON, а не действительный URL. Запрос не будет выполнен, если URL недействителен.

Если вы укажете действительный URL, вызов API внутри другого вызова API должен работать.

0 голосов
/ 10 ноября 2018

Вы можете использовать switchMap операторы rxjs для объединения наблюдаемых.

import { switchMap } from 'rxjs/operators';

this.initService.__init__(res)
.pipe(
   switchMap(profile=> this.initService.initializePeriod(profile))
).subscribe((period) => {
    console.log(period);
});

Если вы хотите получить ответ от обоих, используйте mergeMap

import { mergeMap } from 'rxjs/operators';

this.initService.__init__(res)
.pipe(
   mergeMap(
      profile=> this.initService.initializePeriod(profile), 
     (profile, period) => {
       return [profile,period];
}
   )
).subscribe((response) => {
    console.log(response[0]); //profile
    console.log(response[1]); //period
});

Рабочая копия здесь - https://stackblitz.com/edit/typescript-wy26a7

...