Redux 观察中间件中的存储状态变化
我正在编写一个Redux中间件,它负责在用户的OAuth AccessToken进入API调用之前,将用户的OAuth AccessToken添加到API调用中 但是,我也希望这个中间件能够检测用户的帐户何时过期Redux 观察中间件中的存储状态变化,redux,Redux,我正在编写一个Redux中间件,它负责在用户的OAuth AccessToken进入API调用之前,将用户的OAuth AccessToken添加到API调用中 但是,我也希望这个中间件能够检测用户的帐户何时过期 function tokenExpired() { return (Date.now() > getState().auth.expirationTime); } 当发生这种情况时,中间件将扣留该操作(防止将其传递到链中的下一个中间件),并将其存储在内部列表中。然后启动
function tokenExpired() {
return (Date.now() > getState().auth.expirationTime);
}
当发生这种情况时,中间件将扣留该操作(防止将其传递到链中的下一个中间件),并将其存储在内部列表中。然后启动异步。通过调度“刷新访问令牌”FSA的令牌刷新过程:
if (tokenExpired()) {
// detainActions is an array, declared outside
// of the middleware's scope.
detainActions.push(action);
dispatch(refreshAccessToken());
}
else {
next(sign(action));
}
最后,我想监听“刷新访问令牌”流何时完成并刷新(重新分派)所有被扣留的操作。目前,我正在通过查看AUTHENTICATION\u RESPONSE
FSA流经我的中间件来实现这一点(AUTHENTICATION\u RESPONSE
操作作为refreshAccessToken
thunk的副作用进行调度)
// Redux middleware signature.
return ({dispatch, getState}) => {
return next => action => {
if (action.type === AUTHENTICATION_RESPONSE && !action.error) {
// Let the AuthResponse action pass to the store.
next(action);
// Flush detained actions now we have a new grant.
return flushAndRedispatchDetainedActions(dispatch);
}
else {
// Sign CALL_API requests logic as above.
}
}
}
但是,我对这种方法不满意,因为不确定身份验证\u响应
FSA是否会实际命中还原程序(它可能被其他中间件截获,或者被进一步推迟)
我考虑过的可能替代方法是让refreshAccessToken
actionCreator返回一个thunk,返回一个承诺;这样,我的中间件可以在刷新和重放所有请求之前等待该承诺得到解决,即:
if (tokenExpired()) {
// refreshAccessToken thunk returns a Promise.
dispatch(refreshAccessToken());
.then(flushAndRedispatchDetainedActions();
}
或者alternativley我可以让我的中间件直接观察存储,并在auth.accessToken
值更改时触发一个操作-但是,我不清楚中间件观察存储的指导是什么(我猜这是不可能的,因为中间件需要在创建最终存储对象之前实例化)
谢谢:)
更新
在回家的路上思考问题;如果我将实际的身份验证逻辑从refreshAccessToken
(一个thunk'd action creator)移到中间件本身,那么我将省去很多痛苦:
// Redux middleware signature.
return ({dispatch, getState}) => {
return next => action => {
if (action[CALL_AUTH]) {
authHelper.refreshGrant()
.then(grant => dispatch(processGrant(newGrant));
}
else {
// Sign CALL_API requests logic as above.
}
}
}
我最终创建了一个商店增强器,用于标记在减少操作后执行的具有副作用的操作:可以这样做吗?
// Redux middleware signature.
return ({dispatch, getState}) => {
return next => action => {
if (action[CALL_AUTH]) {
authHelper.refreshGrant()
.then(grant => dispatch(processGrant(newGrant));
}
else {
// Sign CALL_API requests logic as above.
}
}
}