调用new SaveModelAction()
时,相应的效果陷入无限循环。
此效果:
@Effect() saveModelAction = this.action$.pipe(
ofType(SAVE_MODEL),
switchMap((action: any) => {
const storageMetaData: StorageData = action.payload;
return this.modelService.loadState()
.pipe(
switchMap((state: State) => {
const model: Model = AnalysisUtils.convertStateToModel(state, storageMetaData);
return this.modelService.saveModel(model)
.pipe(
map(() => new SavingModelCompleteAction),
catchError((error: Error) => this.createErrorObservableAndLog(error))
);
}),
catchError((error: Error) => this.createErrorObservableAndLog(error))
);
})
);
其他信息:
SaveModelAction
仅分配了一次。 this.modelService.loadState()
的状态时,将使用take(1)
。this.modelService.saveModel(model)
除了将模型发送到后端(并返回可观察对象)之外,什么也不做。有人能指出我问题的正确方向吗?谢谢!
答案 0 :(得分:1)
switchMap
具有不同的用途。
如我所见,您只想展平Observables,因此应使用flatMap
或mergeMap
而不是switchMap
。
有关这些运算符的更多信息:https://www.learnrxjs.io/operators/transformation/switchmap.html
尝试这样的事情:
@Effect() saveModelAction = this.action$.pipe(
ofType(SAVE_MODEL),
mergeMap((action: any) => {
const storageMetaData: StorageData = action.payload;
return this.modelService.loadState()
.pipe(
mergeMap((state: State) => {
const model: Model = AnalysisUtils.convertStateToModel(state, storageMetaData);
return this.modelService.saveModel(model)
.pipe(
map(() => new SavingModelCompleteAction),
catchError((error: Error) => this.createErrorObservableAndLog(error))
);
}),
catchError((error: Error) => this.createErrorObservableAndLog(error))
);
})
);
常量具有相同的原始值也是一个常见的错误。对于您的情况,请检查SAVE_MODEL_COMPLETE!= SAVE_MODEL。如果它们具有相同的原始值,那么您将继续调度相同的操作。
答案 1 :(得分:0)
我遇到了同样的问题,效果陷入了无限循环,而take(1)解决了它只能调度一次的问题。
问题是我有2个动作具有相同的类型:(
这应该工作得很好,因此,在效果或动作无限循环的情况下,请检查常量类型:)
祝大家好运!