@ngrx 第二次效果不运行

@ngrx Effect does not run the second time

我刚刚开始学习@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)));

谢谢

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

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

switchMap 中组合 catch 将在发生错误时阻止效果完成。

您必须将 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)))
        })
    );
 );

请注意,myService 中的 evetResponse() 方法应该 return 一个可观察对象,以便之后使用管道。 如果您的方法在服务 returns Promise 内,您可以通过使用 rxjs 包中的 from 将其转换为可观察对象,如下所示:

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

有关更多详细说明,请查看此 link