私はrxjsにかなり慣れていません。
angular 2 httpリクエストを次のように実行する関数を作成しようとしました:
_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$;
}
_
つまり、成功すると、リクエストが成功したかどうかを示すオブジェクトを返します。その後、返されたオブジェクトに応じてマップを切り替えたいと思います。
_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);
}
});
_
そして、ここに私が直面する問題があります。 console.log(...)は、次のようなオブジェクトを出力します。
_value, {"_isScalar": true, "value": THIS_IS_WHAT_I_NEED_AS_VALUE, "scheduler": null}
_
ただし、syncFromApi $関数で返したオブジェクトのみが必要です。
observable.of()
を間違った方法で使用している場合、誰かが私に説明できますか?
observable.of(1)
を試しましたが、値として1が返されます。オブジェクト(observable.of({ type: "myType", message: "myMessage" })
)を使用すると、必要なオブジェクトをキー「_isScalar」、「value」、「scheduler」でラップしたオブジェクトが返されます。
前もって感謝します。
あなたの問題はあなたのmap
演算子にあります:
let ob$ = this.http.post(
CONFIG_APP.apiEndpoint + '/sync/app',
'',
{ headers: headers }
)
.map((response:Response) => {
return {type: "success", payload: response.json()}; // <----
})
オブザーバブルではないオブジェクトを返す必要があります。 map
演算子は、オブジェクトをそのまま使用し、返されたオブザーバブルをオブザーバブルチェーンに投影しません。
戻りたい場合はObservable.of
何らかの理由で、代わりにflatMap
演算子を使用する必要があります。
let ob$ = this.http.post(
CONFIG_APP.apiEndpoint + '/sync/app',
'',
{ headers: headers }
)
.flatMap((response:Response) => {
return Observable.of({type: "success", payload: response.json()});
})
catch
演算子は、関連するコールバックにobservableが返されることを期待しているため、これで問題ありません。