【发布时间】:2016-11-02 12:11:44
【问题描述】:
我的应用的数据源只提供 XML 格式的数据。
我使用 axios 来获取 XML 数据。它在结果的数据部分中以字符串形式结束。
我尝试使用 xml2js 对其进行转换,但它只是触发异步作业并返回,所以我没有让 redux-promise middelware 工作。当 reducer 将数据发送到应该渲染它的组件时,有效负载什么都不是。
不确定这是否有意义,但我可以让 reducer 在组件上发送数据之前等待新函数调用返回吗?
动作索引.js
export function fetchData(jobid, dest) {
const url = `${DATA_URL}jobid=${jobid}&refdist=${dest}`;
const request = axios.get(url);
console.log(request);
return {
type: FETCH_DATA,
payload: request
}
}
我的减速器
export default function (state = [], action) {
console.log(action);
switch (action.type) {
case FETCH_DATA:
console.log("pre");
parseString(action.payload.data, function (err, result) {
// Do I need some magic here??? or somewhere else?
console.dir(result);
});
return [action.payload.data, ...state];
}
return state;
}
【问题讨论】:
-
我知道reducer 代码不正确,因为它返回未转换的XML 字符串,但我应该返回什么?或者我可以阻止减速器返回,直到 parseString 函数返回?
-
reducer 不应该解析。 reducer 采取行动和旧状态以形成新状态。它的工作不是获取或转换任何东西。如果你可以暂停你的 reducer,你会想要锁定整个浏览器页面直到它完成吗?等到您准备好所有数据,然后再发送一个操作以将其放入您的应用程序状态。这包括数据的异步解析。
-
使用 Redux-Thunk 进行异步操作。或者使用 Redux-Saga(准备好学习曲线)。
-
在你的 reducer 中,FETCH_DATA 应该首先返回 ...state,而不是最后一个。所以应该是
return [...state, action.payload.data]你的更新状态被旧状态覆盖
标签: javascript reactjs redux reducers redux-promise