等待一个observable完成,启动另一个,并订阅它的输出

时间:2017-05-30 19:40:15

标签: angular typescript ionic2 rxjs rxjs5

我有一个函数可以选择设置一个包含从localStorage检索到的数据的标题。 localStorage操作返回一个我可以变成Observable的承诺。设置(或不设置)标头后,我想发出一个http请求并返回Observable:

let startObs;
if (useHeaders) {
  startObs = Observable.fromPromise(this.getStoredHeaders());
}
else {
  startObs = Observable.empty();
}

// wait for startObs here

return this.http.get(url, headers);

基本上我想等待startObs完成,然后返回http.get Observable。我尝试过使用类似startObs.concat(this.http.get())startObs.switch(this.http.get())的内容,但这会从源可观察源和http.get可观察对象中发出。我想要发出http.get Observable。

在等待前一个observable完成时,有没有办法只订阅链中的最后一个observable?

2 个答案:

答案 0 :(得分:0)

您无法通过concatswitch等运营商实现您的目标,因为您仍然会同步调用this.http.get()(在您存储的标头之前)准备)。请改用mergeMap

return startObs.mergeMap(headers => this.http.get(url, headers));

答案 1 :(得分:0)

对于concatMap来说,这看起来很简单:

startObs
    .concatMap(() => this.http.get(url, headers))
    .subscribe(...);

由于它应该使用回调函数映射值,您可以简单地忽略从源startObs发出的值,并返回一个新的Observable。

您还可以链接多个concatMap运算符,因为它们仅在前一个Observable完成时才订阅下一个Observable。