我在我的角度项目中使用redux-observable。我的史诗中有updateNode
功能,catchError
处理。我多次派遣行动DB_UPDATE_NODE
,一切顺利。然而,当我再次发送该动作时,时间动作执行catchError
,updateNode
函数不再被调用。
public updateNode(action$: Observable<IScenarioNodesAction>, store: Store<IAppState>){
return action$.pipe(
ofType(ScenarioNodeActionType.DB_UPDATE_NODE),
flatMap((action) => {
return this._scenarioNodeService.update(action.payload.botId);
}),
flatMap(data => [
this._scenarioNodeAction.updateNode(data),
]) ,
catchError((error) => {
return Observable.of(this._commonAction.showError(error));
})
);
}
您必须捕获服务流上的错误。
flatMap((action) => {
return this._scenarioNodeService.update(action.payload.botId)
.pipe(catchError(...)) ;
})
有关更多信息,请参阅docs。
这里我们将catchError()放在我们的mergeMap()中,但是在我们的AJAX调用之后;这很重要,因为如果我们让错误到达动作$ .pipe(),它将终止它并且不再监听新动作。
如果您的observable返回错误,它会阻止观察者获取新事件。
请添加catchError类似于:
public updateNode(action$: Observable<IScenarioNodesAction>, store: Store<IAppState>){
return action$.pipe(
ofType(ScenarioNodeActionType.DB_UPDATE_NODE),
flatMap((action) => {
return this._scenarioNodeService.update(action.payload.botId);
}),
flatMap(data => [
this._scenarioNodeAction.updateNode(data),
]) ,
catchError((error) => {
retryWhen((errors) => {
return errors
.pipe(delay(1000), take(1))
.concat(Observable.throw(`Error`));
},
),
})
);
}
以上是什么等待第二个delay(1000)
并重试take(1)
的次数。如果错误仍然存在,则抛出错误.concat(Observable.throw('Error'))
。在你的情况下,你只需要调用showError
和drop
连接。