我有一个函数可以选择设置一个包含从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?
答案 0 :(得分:0)
您无法通过concat
和switch
等运营商实现您的目标,因为您仍然会同步调用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。