当调用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)
什么都不做。
谁能指出我的问题的正确方向?谢谢!
switchMap
有不同的目的。
如我所见,您只想扁平化可观察量,因此您应该使用 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。如果它们具有相同的基元值,则继续调度相同的操作。
我遇到了同样的问题,效果卡在一个无限循环中,take(1( 解决了它只调度一次。
问题是我有 2 个具有相同类型的操作:(
这应该可以完美地工作,因此在效果或动作无限循环的情况下,请检查常量类型:)
祝大家好运!