在 catchError 之后不会执行 redux-observable
Posted
技术标签:
【中文标题】在 catchError 之后不会执行 redux-observable【英文标题】:redux-observable wont be execute after catchError 【发布时间】:2019-02-17 21:00:02 【问题描述】:我在我的 Angular 项目中使用 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));
)
);
【问题讨论】:
【参考方案1】:如果您的 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
连接即可。
【讨论】:
谢谢!我添加了捕捉错误,但同样发生了。不确定,但您能否告诉我添加代码时我的代码如何?也许我错了! 谢谢!我已经改变了,但我有类型错误。Type 'UnaryFunction<Observable<>, Observable<>>' is not assignable to type 'ObservableInput<>'.
【参考方案2】:
您必须在服务的流中捕获错误。
flatMap((action) =>
return this._scenarioNodeService.update(action.payload.botId)
.pipe(catchError(...)) ;
)
请参阅docs 了解更多信息。
这里我们将 catchError() 放在我们的 mergeMap() 中,但在我们的 AJAX 调用之后;这很重要,因为如果我们让错误到达 action$.pipe(),它将终止它并且不再监听新的操作。
【讨论】:
谢谢!但我遇到了另一个错误,说我无法在 setter 上设置值:( 我错了,你必须在服务调用中这样做,我没有看到第二个平面图。查看更新的答案 我在服务中做了但没有结果。以上是关于在 catchError 之后不会执行 redux-observable的主要内容,如果未能解决你的问题,请参考以下文章
从角度服务通过管道传输时,rxjs catchError 不起作用