Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在redux中实现两个操作之间的回调_Javascript_Callback_Redux_React Redux_Reducers - Fatal编程技术网

Javascript 在redux中实现两个操作之间的回调

Javascript 在redux中实现两个操作之间的回调,javascript,callback,redux,react-redux,reducers,Javascript,Callback,Redux,React Redux,Reducers,我对react是新手,我正在将我的web应用程序从angular改造为react。我被困在这一点上了。我的应用程序需要一个令牌来执行API调用。当某个令牌在某个特定API调用上过期时,我会观察失败情况并运行刷新令牌调用,当刷新令牌调用成功时,我会重新运行该特定API。在angular中实现很简单,但在react redux中我就是搞不懂 这是我的角度代码 var fetchAccessToken = function(successCallback,failureCallback){ i

我对react是新手,我正在将我的web应用程序从angular改造为react。我被困在这一点上了。我的应用程序需要一个令牌来执行API调用。当某个令牌在某个特定API调用上过期时,我会观察失败情况并运行刷新令牌调用,当刷新令牌调用成功时,我会重新运行该特定API。在angular中实现很简单,但在react redux中我就是搞不懂

这是我的角度代码

var fetchAccessToken = function(successCallback,failureCallback){
    if($cookies.get('aid')){
        accountGetATAPI.save({
            a_id    : $cookies.get('aid'),
            d_id    : window.fingerprint.md5hash,
            at      : getAt(),
            cl      : "W",
            rt      : getRefreshToken(),
            k_ey    : getSecret()
        },function (res) {
            var at = res.data.at;
            //console.log("server received token: " + at);
            $cookies.put('at',res.data.at); 
            successCallback(res);
        },function (res) {
            failureCallback(res);
        });
    }
};

var fetchProfiles = function(successCallback,failureCallback,currentTry,maxTry) {
    var aid = data["Account"]["_id"];
    accountProfileFetchAPI.save({
        a_id    : getAccountId(),
        tokn    : getAt()
    },function(res){
        data["Profiles"] = res["data"]["Profile"];
        //200
        successCallback(res);
    },function(res){
        //not 200
        if(res.status == error_constants.TOKEN_EXPIRE_CODE) {
            fetchAccessToken(function(){
                if(currentTry < maxTry) {
                    fetchProfiles(successCallback, failureCallback, ++currentTry, maxTry);
                } else {
                    console.log("maximum tries exceeded");
                }
            },function(res){
                if(res.status == (error_constants.TOKEN_EXPIRE_CODE || error_constants.TOKEN_ERROR_CODE)){
                    failureCallback(error_constants.LOGOUT_USER,res);
                }
            });
        } else {
            failureCallback(null,res);
        }
    });
};
var fetchAccessToken=函数(successCallback,failureCallback){
如果($cookies.get('aid')){
accountGetATAPI.save({
a_id:$cookies.get('aid'),
d_id:window.fingerprint.md5hash,
at:getAt(),
cl:“W”,
rt:getRefreshToken(),
k_ey:getSecret()
},功能(res){
var at=res.data.at;
//log(“服务器接收到令牌:+at”);
$cookies.put('at',res.data.at);
成功回调(res);
},功能(res){
故障回调(res);
});
}
};
var fetchProfiles=函数(successCallback、failureCallback、currentTry、maxTry){
var aid=数据[“账户”][“账户id”];
accountProfileFetchAPI.save({
a_id:getAccountId(),
tokn:getAt()
},功能(res){
数据[“配置文件”]=res[“数据”][“配置文件”];
//200
成功回调(res);
},功能(res){
//不是200
if(res.status==error\u constants.TOKEN\u EXPIRE\u CODE){
fetchAccessToken(函数(){
如果(currentTry
我正在尝试在react代码中执行类似的操作。到现在为止,我只到了这里。我知道密码是垃圾。但我还是在想

export function fetchProfiles(currentTry,maxTry) {
return function(dispatch) {
axios.post("/profile/find",{
  a_id : cookies.load("aid"),
  tokn : cookies.load("at")
}).then((response) => {
    console.log(response);        
    dispatch({type: "FETCH_PROFILES_FULFILLED", payload: response.data.data})
  })
  .catch((err) => {
    console.log(err)
    if(err.response.status == 498){
       fetchAccessToken((res) =>{
         if(currentTry < maxTry) {
             console.log("at successcall ",currentTry,maxTry);
             fetchProfiles(++currentTry, maxTry);
         } else {
             console.log("maximum tries exceeded");
         }
         console.log(res);
       },(err) =>{
         console.log(err);
       });
      return;
    }
    dispatch({type: "FETCH_PROFILES_REJECTED", payload: err})
  })
  }
 }

export function fetchAccessToken(successCallback,failureCallback){
 axios.post("/account/g_at_w",{
   a_id  : cookies.load('aid'),
   d_id  : window.fingerprint.md5hash,
   at    : cookies.load('at'),
   cl    : "W",
   rt    : cookies.load('rt'),
   k_ey  : cookies.load('secret')
 }).then((response) => {
     console.log(response);
     successCallback(response);
     // dispatch({type: "FETCH_PROFILES_FULFILLED", payload:    response.data.data})
   })
   .catch((err) => {
     console.log(err.response);
     failureCallback(err);
     // dispatch({type: "FETCH_PROFILES_REJECTED", payload: err})
   })
 }
导出函数fetchProfiles(currentTry、maxTry){
返回功能(调度){
axios.post(“/profile/find”{
a_id:cookies.load(“aid”),
tokn:cookies.load(“at”)
})。然后((响应)=>{
控制台日志(响应);
分派({type:“FETCH_PROFILES_completed”,有效负载:response.data.data})
})
.catch((错误)=>{
console.log(错误)
如果(err.response.status==498){
fetchAccessToken((res)=>{
如果(currentTry{
控制台日志(err);
});
返回;
}
分派({type:“FETCH\u PROFILES\u REJECTED”,负载:err})
})
}
}
导出函数fetchAccessToken(successCallback、failureCallback){
axios.post(“/account/g_at_w”{
a_id:cookies.load('aid'),
d_id:window.fingerprint.md5hash,
at:cookies.load('at'),
cl:“W”,
rt:cookies.load('rt'),
k_ey:cookies.load('secret')
})。然后((响应)=>{
控制台日志(响应);
成功回调(应答);
//分派({type:“FETCH_PROFILES_completed”,有效负载:response.data.data})
})
.catch((错误)=>{
控制台日志(错误响应);
故障回调(err);
//分派({type:“FETCH\u PROFILES\u REJECTED”,负载:err})
})
}

我使用redux thunk和axios执行api调用。非常感谢您的帮助。

请告诉我们您的方法面临的问题?如果返回函数(dispatch){}内成功,我无法调用fetchProfiles()。fetchProfiles()被忽略。控制台中有错误吗?关于
fetchProfiles
No!什么都没有,只是被忽略了。试试
dispatch(fetchProfiles(++currentTry,maxTry))
。也许我对你的执行有些怀疑。