2017-09-13 11 views
0

私はAnger 2 Projectで働き、ngrxとrxjsの技術を使用します。rxJSとngrx - 効果の中で成功/失敗の正しい構造は何ですか?

今私は問題を抱えている:私は効果を宣言する

してみてください。 効果がhttpリクエストを持っていて、成功した場合にのみを返します他のhttp-requestを呼びたいのででも成功すれば - 成功アクションをディスパッチします。

私はエラーをスローしてテストしましたが、常にアクションが送信されます。

参照:

 @Effect() 
createEntity$ = this.actions$.ofType(CREATE_ENTITY) 
    .switchMap((action: CreateEntity) => { 

     return this.httpService.getDefaultEntityData(action.payload.type).map((entity) => { 
      return Observable.throw("testing only"); 
      /*if (entity) { 
       entity.title = entity.type; 
       return this.httpService.addEntity(entity); 
      }*/ 
     }) 

      .catch((error) => Observable.of(new createEntityFailure(error))) 
      .map(mappedResponse => ({ type: CREATE_ENTITY_SUCCESS, payload: mappedResponse })) 
    }); 

答えて

1

どのようにこの件について:

this.actions$ 
    .ofType(CREATE_ENTITY) 
    .map((action: CreateEntity) => action.payload) 
    .switchMap(payload => 
     this.httpService.getDefaultEntityData(payload.type) 
     .mergeMap(entity => this.httpService.addEntity(entity)) 
     // .mergeMap(entity => Observable.throw('error')) // or this for testing 
     .mergeMap(response => new actions.Action(...)) 
     .catch(error => new actions.Error(...)) 
    ); 
1

forkJoinが動作しませんと平行であるとして、あなたはどちらか、スプリット、このアップ複数のアクションへのか、単にはObservable.forkJoin

 @Effect() createEntity$ = this.actions$.ofType(CREATE_ENTITY) 
.switchMap((action: CreateEntity) => { 
    return Observable.forkJoin(
     this.httpService.callOne(), 
     this.httpService.callTwo() 
    ) 
    .catch((error) => Observable.of(new createEntityFailure(error))) 
    .map(mappedResponse => ({ type: CREATE_ENTITY_SUCCESS, payload: mappedResponse })) 
}); 

を使用して、同じ効果で他のAPI呼び出しを追加することができますあなたのために。あなただけの最初のAPI呼び出しのswitchMapとは、第二を返すことができます:

 @Effect() createEntity$ = this.actions$.ofType(CREATE_ENTITY) 
.switchMap((action: CreateEntity) => { 
    return this.httpService.callOne(); 
}) 
.switchMap((response) => { 
    return this.httpService.callTwo() 
     .map(secondResponse => ({ 
      type: CREATE_ENTITY_SUCCESS, 
      payload: { 
       first: response, 
       second: secondResponse 
      } 
     })) 
}) 
    .catch((error) => Observable.of(new createEntityFailure(error))) 
}); 
+0

forkJoinは、それが平行であり、良いではありません。 – user2783091

+0

@ user2783091は、別のオプションを含めるように応答を編集しました – Everest

1

1)あなたはObservableを返す場合は、おそらくswithMap代わりmap

2をしたいです)エラーObservablecatchから戻すため、アクションは常にディスパッチされています。 Observable.throwObservable.ofを変更すると、エラーがスローされますさらに

@Effect() 
createEntity$ = this.actions$.ofType(CREATE_ENTITY) 
    .switchMap((action: CreateEntity) => 
     this.httpService.getDefaultEntityData(action.payload.type) 
    ) 
    .switchMap((entity) => { //          <------ switchMap here 
     return Observable.throw("testing only"); 
     /*if (entity) { 
      entity.title = entity.type; 
      return this.httpService.addEntity(entity); 
     }*/ 
    }) 
    .catch((error) => 
     Observable.throw(new createEntityFailure(error)) //   <------ throw here 
    ) 
    .map((mappedResponse) => 
     ({ type: CREATE_ENTITY_SUCCESS, payload: mappedResponse }) 
    ); 
関連する問題