效果陷入无限循环 - Ngrx/effects
Effect is stuck in an infinite loop - Ngrx/effects
调用new SaveModelAction()
时,相应的Effect陷入死循环。
这个效果:
@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
有不同的目的。
如我所见,你只是想扁平化 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。如果它们具有相同的原始值,那么您将继续调度相同的操作。
我遇到了同样的问题,effect 陷入了无限循环,take(1) 只派发了一次就解决了。
问题是我有 2 个相同类型的动作 :(
这应该可以完美运行,所以如果效果或动作无限循环,请检查常量类型:)
祝大家好运!
调用new SaveModelAction()
时,相应的Effect陷入死循环。
这个效果:
@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
有不同的目的。
如我所见,你只是想扁平化 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。如果它们具有相同的原始值,那么您将继续调度相同的操作。
我遇到了同样的问题,effect 陷入了无限循环,take(1) 只派发了一次就解决了。
问题是我有 2 个相同类型的动作 :(
这应该可以完美运行,所以如果效果或动作无限循环,请检查常量类型:)
祝大家好运!