如何获得观察者的订阅结果?

时间:2018-11-10 13:30:50

标签: angular rxjs rxjs5

我有两个对服务器的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 :(得分:2)

您可以使用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

答案 1 :(得分:0)

您需要检查您从第一次API调用(配置文件)获得的结果。检查您的浏览器控制台。该配置文件可能是JSON,而不是有效的URL。如果网址无效,请求将不会通过。

如果您提供有效的URL,则另一个API调用内的API调用应该可以正常工作。