我在我的角度项目中使用了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));
})
);
}
答案 0 :(得分:0)
如果您的可观察对象返回错误,它将阻止观察者获取新事件。
请在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
连接即可。
答案 1 :(得分:0)
您必须在服务流中捕获错误。
flatMap((action) => {
return this._scenarioNodeService.update(action.payload.botId)
.pipe(catchError(...)) ;
})
有关更多信息,请参见docs。
在这里,我们将catchError()放置在mergeMap()内,但是在AJAX调用之后;这很重要,因为如果我们让错误到达action $ .pipe(),它将终止该错误,并且不再侦听新操作。