【发布时间】:2018-02-06 04:57:36
【问题描述】:
我正在尝试为 redux-observable 编写 Epic。但我有一个问题(
ON_EMPTY_FORM_STATE 动作在.map(response => formSavedAction(response)) 执行之前执行。
我该如何解决?基本上我想要得到的是:
- 捕获
FORM_SEND动作 - 发送带有负载的 Ajax 请求
- 如果我从服务器收到 200 响应然后执行
formSavedAction(response) - 如果我收到 500 错误然后发送
{ type: ON_FORM_SUBMIT_ERROR } - 最后(无论返回什么 Ajax 请求)我要调度操作
{ type: EMPTY_FORM_STATE }
这是我的代码:
const saveProductEpic = (action$, $store) =>
action$.ofType(SUBMIT_FORM)
.mergeMap(action => ajax.post('http://localhost:9000/products', action.payload,
{ 'Content-Type': 'application/json' }))
.map(response => formSavedAction(response))
.catch(err => { $store.dispatch({ type: ON_FORM_SUBMIT_ERROR }) })
.do(() => { $store.dispatch({ type: EMPTY_FORM_STATE }) })
问题是动作{ type: EMPTY_FORM_STATE } 被调度之前
而不是在 AJAX 请求之后。
有没有办法解决这个问题?
【问题讨论】:
-
只需删除
.do块并将$store.dispatch({ type: EMPTY_FORM_STATE })添加到.then和.catch两个案例中 -
不工作....我收到错误 TypeError: action$.ofType(...).mergeMap(...).map(...).then is not a function
-
我能知道你为什么在代码中使用
.map而不是.then吗?以及您使用什么 http 库? -
如果我使用 .then 而不是 .map 会有什么不同吗?我正在使用 RX.Dom.Ajax
标签: javascript reactjs rxjs redux-observable