Redux 观察中间件中的存储状态变化

Redux 观察中间件中的存储状态变化,redux,Redux,我正在编写一个Redux中间件,它负责在用户的OAuth AccessToken进入API调用之前,将用户的OAuth AccessToken添加到API调用中 但是,我也希望这个中间件能够检测用户的帐户何时过期 function tokenExpired() { return (Date.now() > getState().auth.expirationTime); } 当发生这种情况时,中间件将扣留该操作(防止将其传递到链中的下一个中间件),并将其存储在内部列表中。然后启动

我正在编写一个Redux中间件,它负责在用户的OAuth AccessToken进入API调用之前,将用户的OAuth AccessToken添加到API调用中

但是,我也希望这个中间件能够检测用户的帐户何时过期

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.
        }
    }
}