react-native-communityasyncStorage removeItem 导致程序行为怪异。

问题描述 投票:0回答:1

我在用户注销时执行了这段小代码。

 async function logoutAction(props) {
  removeUser();
  props.logoutUser();
}

removeUser()里面的功能是...。

 export const removeUser = async () => {
  try {
    await AsyncStorage.removeItem(Constant.storage.user_data);
    await AsyncStorage.removeItem(Constant.storage.token);
    await AsyncStorage.removeItem(Constant.storage.notification_token);
    return true;
  } catch (exception) {
    return false;
  }
}

这将清除本地存储中的用户相关数据.同样。props.logoutUser() 是对reducer的引用调用,它将loggedIn状态设置为false。

我遇到的问题是,如果 removeUser() 函数被调用一次,axios的http请求就不会再进入拦截器,而且每次请求都会抓到一个'undefined'的错误。 如果把这个方法去掉,一切都能正常工作,我可以通过去掉一次拦截器,执行一个请求,然后再添加拦截器,让它进入工作状态,这是我在这里和那里花了几个小时后找到的。

我的拦截器是。

    export const requestInterceptor = axios.interceptors.request.use(
  async config => {
    const token = await getToken();
    if (token != '') {
      config.headers.Authorization = token;
    }
    console.log('axios request', config);
    return config;
  },
  error => {
    // console.warn('on request error')
    return Promise.reject(error);
  },
);

export const responseInterceptor = axios.interceptors.response.use(
  function(response) {
    console.log('axios response', response);
    // console.warn('on response success', response.status)
    return response;
  },
  async function(error) {
    if (error.response.status === 401) {
      //logout user
      return;
    }
    return Promise.reject(error);
  },
);

我使用的是 @react-native-community/AsyncStorage 包来维护本地存储。我怀疑问题可能出在 removeItem 方法,但我不确定,因为官方文档中没有包含这个 removeItem 方法,或者在拦截器中,反正我觉得没有问题。

我到底做错了什么?请给我一些启示。

react-native axios interceptor asyncstorage
1个回答
1
投票

或者可以尝试添加一个 await 之前 removeUser(); ?

async function logoutAction(props) {
  await removeUser();
  props.logoutUser();
}

0
投票

这个问题相当愚蠢,甚至不涉及到。AsyncStorageremoveItem 并作为 Matt Aft 在评论中指出,这是由于在注销时删除了拦截器中的token后的调用所致。因此,将

const token = await getToken();
    if (token != '') {
      config.headers.Authorization = token;
    }

  await getToken()
          .then(token => {
            config.headers.Authorization = token;
          })
          .catch(_ => {
            console.log('no token');
          });

拦截器中的,并返回承诺从。getToken 方法做了这件事,多亏了 Matt高鵬翔.

© www.soinside.com 2019 - 2024. All rights reserved.