8

HTTP アクションを作成してディスパッチするための単純なコード パスが必要です。私がやりたいことは次のようなものです:

this.http.request(...)
  .map((res: Response) => res.json())
  .catch((err: any) => err.json())
  .map((payload: any) => { type: 'SUCCESS', payload })
  .catch((payload: any) => { type: 'FAILURE', payload})
  .subscribe((action: Action) => this.store.dispatch(action));

このようにして、成功と失敗の両方の応答が JSON に変換され、成功/失敗の基準に基づいて正しいリダクション タイプが割り当てられるため、ストアを適切に操作できます。(200 または 401 を返すユーザー ログインの成功と失敗を考えてください)。

これを処理するためのよりクリーンまたはより良い方法はありますか? オブザーバブルを返さないため、現在の 2 番目.catchはうまく機能しません。

提案やその他の解決策を歓迎しますか?

4

2 に答える 2

8

私のサービスの1つでは、次のようにします。

get(url, actionType) {
  this._http.get(BASE_URL + url)
    .map(response => response.json())
    .map(payload => ({ type: actionType, payload }))
    .subscribe(action => this.store.dispatch(action), error => this._apiErrorHandler(error));
}

private _apiErrorHandler(response) {
  let payload = response.json().error;
  this.store.dispatch({ type: 'API_ERROR', payload });
}
于 2016-02-13T20:02:09.417 に答える