Reactjs React Redux-在减速器中添加异步方法是一种反模式吗?

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 {

我对react native/redux的整个世界都很陌生,所以这个问题可能听起来很愚蠢:)

我知道对于API调用或类似的东西,惯例是使用中间件,但它总是必要的吗?(它增加了很多样板)

我成功地在reducer中添加了一个异步方法来管理设备API连接,例如应用程序内或本地通知,但我想知道这样处理是否合适

例如,在my 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
    }
  }
}
也许它在性能上没有效率,或者很难维持……你对此有什么想法


谢谢:)

在我所从事的一个项目中,我们将异步代码付诸实施,并使用称为“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 });
   });
};