我刚刚开始学习@ 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)));
由于
答案 0 :(得分:21)
听起来好像发生了错误。在这种情况下,catch
返回的observable中的动作将被发送到效果的流中,然后效果将完成 - 这将阻止在发出错误动作后运行效果。
将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)))
);
如果发生错误,在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