react-native-community/asyncStorage removeItem 导致程序行为异常

react-native-community/asyncStorage removeItem causes program to behave weirdly

我在用户注销期间执行了这个小代码片段。

 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 方法,或者在拦截器中,这对我来说似乎没有问题。

我这里做错了什么??请给我一些光..

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

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

这个问题很愚蠢,甚至与 AsyncStorageremoveItem 无关,正如 Matt Aft 在评论中指出的那样,这是由于拦截器中对令牌的调用在注销时将其删除后。所以,替换

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

来自

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

在拦截器中并从 getToken 方法返回 promise 完成了这件事。 感谢 Matt高鵬翔.