@ngrx效果第二次不运行

时间:2017-05-25 12:15:46

标签: effects ngrx

我刚刚开始学习@ ngrx / store和@ ngrx.effects,并在我的Angular / Ionic应用程序中创建了我的第一个效果。它第一次运行正常,但如果我再次将事件发送到商店(即再次单击按钮),则没有任何反应(没有进行网络调用,控制台日志中没有任何内容)。我有什么明显的错误吗?这有效果:

@Effect() event_response$ = this.action$
    .ofType(SEND_EVENT_RESPONSE_ACTION)
    .map(toPayload)
    .switchMap((payload) => this.myService.eventResponse(payload.eventId,payload.response))
    .map(data => new SentEventResponseAction(data))
    .catch((error) => Observable.of(new ErrorOccurredAction(error)));

由于

2 个答案:

答案 0 :(得分:21)

听起来好像发生了错误。在这种情况下,catch返回的observable中的动作将被发送到效果的流中,然后效果将完成 - 这将阻止在发出错误动作后运行效果。

mapcatch移至switchMap

@Effect() event_response$ = this.action$
  .ofType(SEND_EVENT_RESPONSE_ACTION)
  .map(toPayload)
  .switchMap((payload) => this.myService
    .eventResponse(payload.eventId, payload.response)
    .map(data => new SentEventResponseAction(data))
    .catch((error) => Observable.of(new ErrorOccurredAction(error)))
);

如果发生错误,在catch内撰写switchMap将阻止效果完成。

答案 1 :(得分:0)

您必须按照以下步骤将map()catchError()移至swithchMap()

@Effect()
public event_response$ = this.action$.pipe(
    ofType(SEND_EVENT_RESPONSE_ACTION),
    switchMap((payload) => {
        return this.myService.eventResponse(payload.eventId,payload.response).pipe(
            map((data: DataType) => new SentEventResponseAction(data)),
            catchError((error) => Observable.of(new ErrorOccurredAction(error)))
        })
    );
 );

请注意,evetResponse()中的myService方法应返回一个observable,以便以后使用管道。 如果服务中的方法返回Promise,则可以通过在rxjs包中使用from将其转换为可观察的形式,如下所示:

import { from } from 'rxjs';
...
const promise = this.myService.eventResponse(payload.eventId,payload.response);
const observable = from(promise);
return observable.pipe(...

有关更多详细信息,请查看此link