变量不';javascript中的不可更改

变量不';javascript中的不可更改,javascript,reactjs,react-native,Javascript,Reactjs,React Native,我有一个这样的代码,console.log(token)显示未定义的 var token; store.get('userTokens').then(res => { token = res.idToken.jwtToken; console.log(res.idToken.jwtToken); }); switch (type) { case 'get': console.log(token); Axios.get(base

我有一个这样的代码,
console.log(token)
显示未定义的

  var token;
  store.get('userTokens').then(res => {
    token = res.idToken.jwtToken;
    console.log(res.idToken.jwtToken);
  });
  switch (type) {
    case 'get':
      console.log(token);
      Axios.get(baseUrl + url, {
        headers: {
          Authorization: `Bearer ${token}`,
          extraHeaders,
        },
      })
        .then(res => {
          console.log(res);
          return res;
        })
        .catch(err => {
          console.log(err);
          return err;
        });
      break;
  }

您需要将
switch
语句移动到
store.get
的承诺解决(或拒绝)后的某个位置

var令牌;
store.get('userTokens')。然后(res=>{
token=res.idToken.jwtToken;
开关(类型){
案例“get”:
console.log(令牌);
获取(baseUrl+url{
标题:{
授权:`Bearer${token}`,
额外标题,
},
})
。然后(res=>{
控制台日志(res);
返回res;
})
.catch(错误=>{
控制台日志(err);
返回错误;
});
打破
}
});

或者您可以使用
wait
来等待
存储。get
函数返回
res
您必须小心使用来自ajax回调方法之外的ajax调用的数据。请求是异步的,通常您的请求尚未完成,但您已经尝试使用存储响应数据的变量

由于您使用的是react,请尝试创建一个名为
token
的状态变量,然后在使用switch语句之前侦听它的更改

正如其他人所建议的,在当前场景中,您需要执行以下操作:

var token;
store.get('userTokens').then(res => {
    token = res.idToken.jwtToken;
    // Check if token has value before you use it.
    if(token)
    {
        switch (type) {
            case 'get':
                console.log(token);
                Axios.get(baseUrl + url, {
                    headers: {
                        Authorization: `Bearer ${token}`,
                        extraHeaders,
                    },
                })
                .then(res => {
                    console.log(res);
                    return res;
                })
                .catch(err => {
                    console.log(err);
                    return err;
                });
          break;
        }
    }
});
为避免错误,请始终检查数据是否来自响应,然后执行操作


由于您使用的是React,我建议您使用React特性来实现这一点。例如,使用React钩子,检查此方法:

函数组件()
{
const[token,setToken]=useState(“”);
//当令牌值更改时执行某些操作
useffect(()=>{
如果(令牌)
performSwitchOperations(token);//传递状态变量token
},[token])
//检索令牌时要执行的函数
const performSwitchOperations=(令牌)=>
{
开关(类型){
案例“get”:
console.log(令牌);
获取(baseUrl+url{
标题:{
授权:`Bearer${token}`,
额外标题,
},
})
。然后(res=>{
控制台日志(res);
返回res;
})
.catch(错误=>{
控制台日志(err);
返回错误;
});
打破
}
}
const performAjaxRequest=()=>
{
return store.get('userTokens')。然后(res=>
{
log(res.idToken.jwtToken);
setToken(res.idToken.jwtToken);
});
}

}
因为您尚未定义它,所以您刚刚声明了它,async仍在进行中……这是否回答了您的问题?