web-dev-qa-db-ja.com

rxjs observable.of(object)は、値の代わりに{"_isScalar": ""、 "value":{}、 "scheduler": ""}を返します

私は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」でラップしたオブジェクトが返されます。

前もって感謝します。

5
divramod

あなたの問題はあなたの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が返されることを期待しているため、これで問題ありません。

13