React Redux - 在Reducer中添加反模式的异步方法吗?

时间:2018-03-07 15:21:14

标签: reactjs react-native redux

我对整个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
    }
  }
}

也许它在表演方面效率不高或难以维护。你对此有何看法?

谢谢:)

3 个答案:

答案 0 :(得分:8)

是。减速器不应该有任何副作用。 Reducers需要纯函数才能使redux高效工作。以下是一些尝试解释why redux needs reducers to be pure functionswhy 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

      

    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都是作为同步方法编写的,它采用stateaction并返回一个新的state