【发布时间】:2016-10-14 06:33:13
【问题描述】:
假设有一个返回一些数据的async read(args) 方法。
我使用redux-thunk 和redux-promise 来调度异步操作。
该方法需要访问 redux 存储才能读取状态树的某些部分,以及传递给 thunkMiddleware.withExtraArguments() 的额外参数。该方法是一种抽象,该方法的具体实现可能需要访问状态树的不同部分(例如,当前会话的 ID、数据源的名称等)。
从方法返回的数据需要经过后处理,然后才能传递给执行渲染的组件。
我正在考虑以下方法来实现上述内容:
方法1.将getState函数传递给async read()方法;像这样实现动作创建器:
const actionRead=()=>async (dispatch, getState, {rpc})=>{
dispatch({type:ActionReadStarted, ...});
let data=await read(rpc, getState);
// post process the data as needed
dispatch({type:ActionReadComplete, data});
};
我不喜欢这里的是直接传递给read 方法的getState。
方法 2. 使 read() 方法本身成为动作创建者:
const actionRead=()=>async (dispatch, getState, {rpc})=>{
dispatch({type:ActionReadStarted, ...});
let data=await dispatch(read());
// post process the data as needed
dispatch({type:ActionReadComplete, data});
};
const read=()=>(dispatch, getState, {rpc})=>{
const arguments=getState().some_arguments;
return rpc.actual_read_returns_promise(arguments);
}
在这两种情况下,reducer 只是将数据写入存储。我不能把后处理逻辑放在reducer中,因为它可能会产生副作用。
我个人赞成第二种方法,但这篇文章建议dispatch 不应返回任何数据:https://github.com/reactjs/redux/issues/61
我对大师的问题:哪种方法更符合react-redux 最佳实践?有没有更好的方法来实现上述?
编辑: 现在我正在使用修改后的第一种方法:
const actionRead=(args)=>async (dispatch, getState, api)=>{
dispatch({type:ActionReadStarted, ...});
let data=await read(args)(dispatch, getState, api);
// post process the data as needed
dispatch({type:ActionReadComplete, data});
};
const read=(args)=>(dispatch, getState, {rpc})=>{
const arguments=getState().some_arguments;
return rpc.actual_read_returns_promise({...args, ...arguments});
}
【问题讨论】:
标签: reactjs redux react-redux redux-thunk