Reactjs React Redux-在减速器中添加异步方法是一种反模式吗?
我对react native/redux的整个世界都很陌生,所以这个问题可能听起来很愚蠢:) 我知道对于API调用或类似的东西,惯例是使用中间件,但它总是必要的吗?(它增加了很多样板) 我成功地在reducer中添加了一个异步方法来管理设备API连接,例如应用程序内或本地通知,但我想知道这样处理是否合适 例如,在my reducer中有以下方法:Reactjs React Redux-在减速器中添加异步方法是一种反模式吗?,reactjs,react-native,redux,Reactjs,React Native,Redux,我对react native/redux的整个世界都很陌生,所以这个问题可能听起来很愚蠢:) 我知道对于API调用或类似的东西,惯例是使用中间件,但它总是必要的吗?(它增加了很多样板) 我成功地在reducer中添加了一个异步方法来管理设备API连接,例如应用程序内或本地通知,但我想知道这样处理是否合适 例如,在my reducer中有以下方法: function initInApp(state, itemSkus){ init(state, itemSkus); return {
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
}
}
}
也许它在性能上没有效率,或者很难维持……你对此有什么想法
谢谢:)在我所从事的一个项目中,我们将异步代码付诸实施,并使用称为“thunk”的“中间件”来解析对对象的承诺,这些承诺可以被我们的还原程序使用。所有的还原器都是作为同步方法编写的,这些同步方法采取
状态
和操作
,并返回一个新的状态
还原器在react中的唯一目的是传递新的状态。
是的,任何Api调用或其他“操作”都不能在reducer中执行,这是一种反模式。
您可以使用各种异步操作模块(如react thunk)执行异步操作。还原剂不应有任何副作用。redux需要是纯函数,才能高效工作。这里有几个链接,试图解释和解释 正如其他人指出的,thunk中间件是react中处理异步的常用方法 另一种不需要任何库的方法是通过一种称为“胖动作创建者”的模式。动作创建者可以处理异步操作。他们这样做的方式是在函数周围返回一个“dispatch”包装,这样它就可以自己分派操作 以下是媒体文章中的一个例子:
(本文还链接到以下网址): redux thunk以外的软件包包括:
-
“为所有业务逻辑和行动副作用提供一个位置”
“有了redux logic,您就可以自由地在您的应用程序中编写逻辑
最喜欢的JS风格:`
- 普通回调代码-分派(resultAction)
- 承诺-返回axios.get(url)。然后(…)
- async/await-result=await-fetch(url)
- 观测值-ob$.next(action1)`
-
redux saga是一个库,旨在使应用程序的副作用(即数据获取之类的异步事情和访问浏览器缓存之类的不纯事情)更易于管理、执行更高效、测试更简单,并更好地处理故障。
使用生成器,因此确保您可以方便地使用它们
- ,如果您更喜欢RxJS可观测值
这个图书馆是由杰伊·菲尔普斯创建的,这本书是本·莱什写的。这两本书在react社区都很有名 - 为了完整性
- 前面提到的文章中列出了其他软件包:
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 });
});
};