1

我正在用 react.js 编写一个 SPA,我正在使用 redux-api 来处理后端连接。我想在执行主要操作之前执行同步操作以刷新身份验证令牌;这样,每次我对后端执行操作时,我都会确保令牌有效。

const endpoints = {
 {
   url: '/some/url',
   crud:true,
   prefetch:[
     ({actions, dispatch, getState}, cb) =>{
       actions.auth_token.post(JSON.stringify({
         token: "my token",
         refreshToken: "my_refresh_token"
       }),null, (err, data) =>{
           if(err){
             // HANDLE ERROR
           }
           setToken(data)
       })
     }
   ]
 }
}

const api = reduxApi(endpoints)

如何以同步方式调用预取函数?那么首先刷新令牌,然后刷新动作?

编辑 我们可以做异步的东西,重要的是最后调用 cb(),这里是例子

const endpoints = {
 {
   url: '/some/url',
   crud:true,
   prefetch:[
     ({actions, dispatch, getState}, cb) =>{
        let mills = new Date().getTime()
        const { token, generationTime, accessTokenLife, refreshTokenLife, refreshToken } = localStorage
        // Conditions: exixts token, it is expired, refresh token is not expired
        if(token && generationTime + accessTokenLife - 500 < mills && generationTime + refreshTokenLife - 500 > mills){

        dispatch(actions.token_refresh.get(null, null, (err, data) =>{
        if(err){
           dispatch(setError(err))
        }else{
           refreshTokenData(data)
        }
        cb()
       }))    
   }else{
    cb()
  }
 }
 ]}}

const api = reduxApi(endpoints)
4

1 回答 1

0

您可能不需要每次执行异步操作时都请求令牌。事实上,我鼓励你不要这样做。

您可以在对用户进行身份验证时请求令牌并使用Web 存储对其进行缓存。现在,您无需在每次需要时都发送网络请求来检索用户令牌,而只需检查浏览器的缓存存储。如果用户的令牌存在,则用户已成功通过身份验证。否则,用户尚未登录,您可以将用户重定向到认证页面。

由于这实际上不是您问题的答案,而是解决您问题的不同方式,我也会以更符合问题的方式回答您的问题。您应该能够利用承诺链来请求用户的令牌,然后一旦解决,执行任何其他操作。

我将以一种与 redux-api 不明确相关的抽象方式进行解释,您应该能够足够容易地适应 redux-api 特定的构造。

const actionOne = () => {
   actions.post(myJson)
     .then(response => actionTwo(response))
     .catch(error => console.log(error))
}

您需要进行的一项重要修改是转换actions.auth_token.post为返回一个承诺。然后,您可以将其他操作链接到该承诺的解决。如果你不熟悉 Promise,MDNs文档是相当不错的。有关将函数从回调转换为 Promise 的更多信息,此 Stack Overflow答案非常详细。

于 2017-08-08T03:29:51.107 回答