简体   繁体   中英

Get observable, but wait for promise before activating

I need to wait for a promise to complete before activating an observable in Angular 2 with RxJS.

More specifically, I need to set up state using a third party library that returns promises, and insert some resulting information into my HTTP headers before making GET requests:

export class LiveDataService {

    private headersPromise;

    constructor(public http: Http) {
        this.headersPromise = $.connection('/init').then((state) => setupHeaders(state));
    }

    activate(route: string) {
        return this.http.get('api/v1/' + route, { headers })
            .Merge(anotherStateBasedObservable);
    }

)

Except, although I need to return the observable immediately as shown, I also must wait for the promise to complete before calling the http.get .

I can think of a couple ways that require like 3-4 stages of translation, but I feel like there should be a fairly direct way to do this.

Do you really need an observable to be returned? I would do something like this:

// getState caches the state promise, so '/init' gets requested only once
// but is lazy loaded
var _statePromise = null;
function getState() {
  return _statePromise || (_statePromise = $.connection('/init'));
}

function routeChange(route) {
  return getState()
    .then(state => setupHeaders(state))
    .then(headers => this.http.get('api/v1/' + route, { headers }));
}

EDIT

You can map an observable with async functions using flatMap or flatMapLatest :

// routeSource is an RxJS Observable
var contentSource = routeSource.flatMapLatest(routeChange);

EDIT

You can convert promises to observables and vica versa: Bridging Promises

This might be what you need:

// getState caches the state promise, so '/init' gets requested
// only once, but is lazy loaded
var _statePromise = null;
function getState() {
  return _statePromise || (_statePromise = $.connection('/init'));
}
function Method(route) {
  return Rx.Observable.fromPromise(this.getState())
    .flatMap(state => setupHeaders(state)) // flatMap handles promises
    .flatMap(headers => this.http.get('api/v1/' + route, { headers }))
    .merge(anotherStateBasedObservable);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM