我对整个react-native / redux世界都很陌生,所以也许这个问题听起来很愚蠢:)
我知道对于API调用或类似的东西,惯例是使用中间件,但它是否总是必要的? (它添加了很多样板)。
我成功地在reducer中添加了一个异步方法来管理设备API连接,例如In-App或Local Notifications,但我想知道是否可以这样处理它。
例如,在我的reducer中有这种方法:
function initInApp(state, itemSkus){
init(state, itemSkus);
return {
...state,
itemSkus: itemSkus,
}
}
这个管理异步部分的那个:
async function init(state, itemSkus){
try {
if( !state.isInit ){
const prepare = await Promise.all(RNIap.prepareAndroid());
return{
...state,
isInit: true,
errorCode: false,
}
}
else {
return ...state;
}
} catch (errorCode) {
return{
...state,
isInit: false,
errorCode: errorCode,
itemSkus: itemSkus
}
}
}
也许它在表演方面效率不高或难以维护。你对此有何看法?
谢谢:)
答案 0 :(得分:8)
是。减速器不应该有任何副作用。 Reducers需要纯函数才能使redux高效工作。以下是一些尝试解释why redux needs reducers to be pure functions和why are pure reducers so important in redux的链接。
正如其他人所说,thunk中间件是处理异步反应的常用方法。
另一种不需要任何库的方法是通过称为" Fat Action Creators"的模式。动作创建者可以处理异步操作。他们这样做的方式是返回一个" dispatch"包装函数,因此它可以自己发送动作。
以下是中篇文章的一个例子:
Where Do I Put my Business Logic In a React-Redux Application
(本文也与redux FAQ)相关联:
const fetchUser = (dispatch, id) => {
dispatch({ type: USER_FETCH, payload: id });
axios.get(`https://server/user/${id}`)
.then(resp => resp.data)
.then(user => dispatch({ type: USER_FETCH_SUCCESS,
payload: user }))
.catch(err => {
console.error(err); // log since might be a render err
dispatch({ type: USER_FETCH_FAILED,
payload: err,
error: true });
});
};
redux-thunk以外的软件包包括:
https://www.npmjs.com/package/redux-logic
"一个适合您所有业务逻辑和行动副作用的地方" "使用redux-logic,您可以自由地在您的逻辑中编写逻辑 最喜欢的JS风格:`
- 普通回调代码 - dispatch(resultAction)
- promises - 返回axios.get(url).then(...)
- async / await - result = await fetch(url)
- observables - ob $ .next(action1)`
redux-saga是一个旨在使应用程序副作用(即数据提取等异步事件和访问浏览器缓存之类的不正确事物)更易于管理,执行效率更高,测试更简单以及更好地处理故障的库。
uses generators so make sure you're confortable using them
。
redux-observable,如果您更喜欢RxJS Observables
这个图书馆是由Jay Phelps创建的,这个medium post "redux-observable"是由Ben Lesh编写的。两者都在反应社区中众所周知。
redux-thunk为了完整性。
前面提到的文章中列出了其他软件包:
Where Do I Put my Business Logic In a React-Redux Application
一切顺利!
答案 1 :(得分:3)
反应中的减速器只有通过新状态的唯一目的。 是的任何Api电话或其他"行动"不是用减速机进行的,它是一种反模式。 您可以使用各种异步操作模块(如react-thunk)来执行异步操作
答案 2 :(得分:2)
在我工作的项目中,我们将异步代码放入操作中并使用"中间件"叫" thunk"解决对我们的Reducer可以使用的对象的承诺。所有reducers都是作为同步方法编写的,它采用state
和action
并返回一个新的state
。