在通过动作调度进行状态更新后,在 React 中使用 Redux 执行函数?

Posted

技术标签:

【中文标题】在通过动作调度进行状态更新后,在 React 中使用 Redux 执行函数?【英文标题】:Execute function in React with Redux after the update of the STATE made by the dispatch of an action? 【发布时间】:2021-02-16 14:31:51 【问题描述】:

我将 ReactReduxThunk middleware 一起使用。

在我的应用中,我使用 Axios 与需要承载身份验证的 Web Api 进行交互。当请求状态为 401 Not Authorized 时,我使用拦截器进行拦截。在这种情况下,我有一个刷新 TOKEN 并将其保存在我的 Redux Store 中的操作。

在我的 Axios 拦截器中,我想在执行刷新和保存新令牌的 Redux 操作后立即重新执行我未经授权的请求(使用 axios.request(error.config))。当我的商店中保存了新的 TOKEN 时,我需要执行。

我应该怎么做?

【问题讨论】:

【参考方案1】:

如果您想使用相同的配置重试请求,并且只更改 authToken,您可以尝试以下操作:

const authenticationProvider = (
  store,
  authAction
) => 
  axios.interceptors.response.use(
    response => response, 
    e => setResponseInterceptor(e)
  );



const setResponseInterceptor = (e, authAction, store) => 
  if (
    e.config &&
    e.response &&
    e.response.status === 401 &&
    authAction
  ) 
    console.log('401 intercepted', e);
    return store.dispatch(authAction()).then(_ => api.request(e.config));
  

  return Promise.reject(e);
;

在你调用 Redux Provider 的 App.js 上,像这样调用 authProvider

authenticationProvider(reduxStore, () =>  
  /* Re authenticate function */
  // here you should call the auth service again and save the response on redux
  // or call the re-auth action with reduxStore.dispatch( /* ACTION */)
);

感谢和愉快的编码!

【讨论】:

对不起@AxelBrei,但我不明白你的回答。您的代码中的 authenticationProvider 是什么?我能够使用代码 401 拦截响应,并且能够再次运行该请求。问题是请求应该在我的身份验证操作更新状态之后开始。 @ChristianCascone authenticationProvither 只是您包装所有逻辑以调用后端并尝试再次进行身份验证的函数名称。我在拦截器中所做的是捕获请求错误,因此它不应该在请求之后调度操作。此外,如果您需要等待响应,请使用 Promise 或 async/await 来处理异步请求。希望对您有所帮助!

以上是关于在通过动作调度进行状态更新后,在 React 中使用 Redux 执行函数?的主要内容,如果未能解决你的问题,请参考以下文章

动作调度不更新 Redux/React 中的状态

Redux 状态不会随着动作调度而更新

useSelector 函数没有更新调度函数后的状态 -react hooks

如何响应 redux 中的状态变化并派发另一个动作?

调度操作后 Redux 状态未更新

如何在挂钩中比较来自 react redux 状态的值