首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >react-native-community/asyncStorage removeItem导致程序行为异常

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

Stack Overflow用户
提问于 2020-06-12 13:45:19
回答 2查看 140关注 0票数 0

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

代码语言:javascript
复制
 async function logoutAction(props) {
  removeUser();
  props.logoutUser();
}

removeUser()中的函数如下所示:

代码语言:javascript
复制
 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‘。但是,如果删除此方法,一切都会正常工作。然后,我可以通过删除拦截器一次,执行一个请求,然后再次添加拦截器,使其进入工作状态,这是我在几个小时后找到的。

我的拦截器是:

代码语言:javascript
复制
    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方法,或者在拦截器中,对我来说似乎没有任何错误。

我到底做错了什么?请给我看看光线..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-12 15:26:18

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

代码语言:javascript
复制
const token = await getToken();
    if (token != '') {
      config.headers.Authorization = token;
    }

通过

代码语言:javascript
复制
  await getToken()
          .then(token => {
            config.headers.Authorization = token;
          })
          .catch(_ => {
            console.log('no token');
          });

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

票数 0
EN

Stack Overflow用户

发布于 2020-06-12 14:11:16

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

代码语言:javascript
复制
async function logoutAction(props) {
  await removeUser();
  props.logoutUser();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62338233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档