1

我在react.js中编写SPA,我使用的是redux-api来处理后端连接。我想在执行主要操作之前执行同步操作以刷新身份验证令牌;这样,每次我会对后端做一个动作,我都会确定这个令牌是有效的。预取块内的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) 

如何以同步方式调用预取功能?所以首先令牌刷新然后是Action?

编辑 我们可以做的东西异步,重要的是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) 

回答

0

您可能不需要每次做的时候请求令牌异步行为。事实上,我鼓励你不要。

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

由于这不是您的问题的答案,而是解决您的问题的另一种方式,我还将以与问题更为一致的方式回答您的问题。您应该能够利用promise chaining来请求用户的令牌,然后一旦解决该问题,请执行任何其他操作。

我会用一种抽象的方式解释,与redux-api没有明确关系,您应该能够轻松地适应redux-api特定的构造。

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

你需要做一个重要的修改是转换actions.auth_token.post返回一个承诺。然后,您可以将其他行动链接到解决方案的承诺上。如果您不熟悉承诺MDNs documentation是相当不错的。有关将函数从回调转换为承诺的更多信息,此堆栈溢出answer非常详细。

+1

嗨!感谢你的回答。 在这个例子中,我想让SSCCE指出问题,在开发环境中,我得到令牌并在它到期之前刷新它。在任何情况下,我找到了解决方案:我可以使用异步操作,如果成功或错误,我必须调用cb()函数。而已! –