2016-05-02 19 views
4

Ich bin relativ neu zu rxjs.rxjs observable.of (Objekt) returns {"_isScalar": "", "value": {}, "scheduler": ""} statt Wert

Ich habe versucht, eine Funktion zu erstellen, die einen Winkel 2 HTTP-Anforderung wie das läuft:

syncFromApi$() { 

    // create Headers 
    ... 

    let ob$ = this.http.post(
    CONFIG_APP.apiEndpoint + '/sync/app', 
    '', 
    { headers: headers } 
) 
    .map((response:Response) => { 
    return Observable.of({type: "success", payload: response.json()}); 
    }) 
    .catch(function (err:Response) { 
    return Observable.of({type: "error", payload: err.json()}); 
    }); 

    return ob$; 
} 

Kurz gesagt, wenn der Erfolg habe, ich ein Objekt zurückkehre, das, wenn die Anforderung erfolgreich war anzeigt. Danach möchte ich Karte wechseln je nach zurückgegebene Objekt:

let o$ = syncFromApi$() 
    .switchMap((value) => { 
    console.log("value", JSON.stringify(value, null, 0)); 
    if (data.type === 'success') { 
     return Observable.of(1); 
    } else if (data.type === 'error') { 
     return Observable.of(2); 
    } 
    }); 

Und hier kommt das Problem, das ich gegenüber. Die console.log (...) gibt ein Objekt wie folgt:

value, {"_isScalar": true, "value": THIS_IS_WHAT_I_NEED_AS_VALUE, "scheduler": null} 

Aber ich brauche nur das Objekt, das ich mit der syncFromApi $ Funktion zurückgegeben.

Kann mir jemand erklären, wenn ich observable.of() in der falschen Weise verwende?

Ich versuchte observable.of(1) und es gibt 1 als Wert zurück. Wenn ich ein Objekt verwende (observable.of({ type: "myType", message: "myMessage" })), gibt es ein Objekt zurück, das das benötigte Objekt mit den Schlüsseln "_isScalar", "value" und "scheduler" umschließt.

Vielen Dank im Voraus.

+0

Warum geben Sie ein Observable aus Ihrer Mapping-Funktion zurück, und nicht nur das Objekt? Sie wollen kein Observables Observables. –

+0

Ich möchte später die Kette der Observablen abonnieren – divramod

+0

map Transformieren Sie eine beobachtbare von x in eine beobachtbare von y dank einer Funktion, die x in y umwandelt. Du musst dich nicht in ein Observable einhüllen. –

Antwort

12

Ihr Problem ist in Ihrem map Betreiber:

let ob$ = this.http.post(
    CONFIG_APP.apiEndpoint + '/sync/app', 
    '', 
    { headers: headers } 
) 
.map((response:Response) => { 
    return {type: "success", payload: response.json()}; // <---- 
}) 

Sie benötigen ein Objekt kein beobachtbares zurückzukehren. Der Operator map verwendet das Objekt wie es ist und projiziert das zurückgegebene Observable nicht in die beobachtbare Kette.

Wenn Sie Observable.of aus irgendwelchen Gründen zurückgeben mögen, müssen Sie stattdessen den flatMap Operator verwenden:

let ob$ = this.http.post(
    CONFIG_APP.apiEndpoint + '/sync/app', 
    '', 
    { headers: headers } 
) 
.flatMap((response:Response) => { 
    return Observable.of({type: "success", payload: response.json()}); 
}) 

, die für den catch Operator in Ordnung, da es eine beobachtbare erwartet in seinen zugehörigen Rückruf zurückgegeben werden.

Verwandte Themen