2017-05-30 52 views
0

我有一个函数,可以选择设置一个标题与从localStorage检索的数据。 localStorage操作返回一个承诺,我可以变成一个Observable。一旦标头设置(或没有),我想打一个http请求并返回可观察到的结果:等待观察者完成,开始另一个,并订阅其输出

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观察到。我曾尝试使用类似startObs.concat(this.http.get())startObs.switch(this.http.get())的东西,但是这会从可观察源和http.get可观察值发出。我只想想要发出的http.get可观察。

有没有什么办法可以只等待链中的最后一个观察值,而等待先前的观察值才能完成?

+0

你在哪里订阅数据?更新到 – Aravind

+0

这是异步的,这是可观察到的整点:)所以你将无法按照你想要的方式完成。你应该订阅和做你想要的订阅,但订阅服务也不是一个好主意。您应该简单地创建可观察链,并从组件订阅它,例如 – Maxime

+0

您可以使用concat()然后使用last()。 http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-last –

回答

0

你不能达到你想要像concatswitch经营什么,因为你仍然可以调用this.http.get()同步(之前已存储的标头是准备好)。使用mergeMap代替:

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

这看起来像一个简单的任务concatMap

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

因为它应该使用一个回调函数,你可以简单地忽略从源startObs发出的值映射值,只是返回一个新的Observable。

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