@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
返回的可观察对象中的操作将被发送到效果的流中,然后效果将完成 - 这将阻止 运行 在发出错误操作后产生效果。
将 map
和 catch
移动到 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
我刚刚开始学习@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
返回的可观察对象中的操作将被发送到效果的流中,然后效果将完成 - 这将阻止 运行 在发出错误操作后产生效果。
将 map
和 catch
移动到 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