rxJS和ngrx - 效果中成功/失败的正确结构是什么?

时间:2017-09-13 09:07:37

标签: rxjs ngrx

我在angular 2 Project工作并使用ngrx和rxjs技术。

现在我遇到了一个问题:

我尝试声明一个效果。 效果有http请求,仅在成功时我想调用其他http请求,只有只有成功 - 然后才会调度成功动作。< / p>

我通过抛出错误对其进行了测试,但它始终会调度操作!

请参阅:

       @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 }))
    });

3 个答案:

答案 0 :(得分:1)

您可以将其拆分为多个操作,也可以使用Observable.forkJoin

以相同的效果添加其他API调用
       @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 }))
});

因为forkJoin是并行的,不会为你工作。您可以在第一个API调用上切换map并返回第二个:

       @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)))
});

答案 1 :(得分: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(...))
    );

答案 2 :(得分:1)

1)如果您返回Observable,则可能需要swithMap而不是map

2)始终已调度操作,因为您从Observable返回非错误catch。将Observable.of更改为Observable.throw会进一步引发错误

@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 })
    );