使用 axios 向服务器发出请求会冻结 React Native 应用程序

Posted

技术标签:

【中文标题】使用 axios 向服务器发出请求会冻结 React Native 应用程序【英文标题】:Making requests to server with axios freezes React Native app 【发布时间】:2019-12-02 14:08:24 【问题描述】:

当用户单击按钮时,我试图从某个类别中获取帖子,但如果您单击按钮两次,UI(交互元素、导航)会完全冻结几秒钟。

我尝试删除 async/await 并使用 Promise 进行操作,结果相同。

const api = axios.create(
  baseURL: 'http://192.168.1.33:5000/',
  timeout: 3000,
);
// Action
export const getTrends = () => async (dispatch) => 
  dispatch(
    type: actions.REQUEST_TRENDS
  );
  const r = await api.post('getTrends');
  const response = r.data;
  return dispatch(
    type: actions.RECEIVE_TRENDS,
    articles: response.payload.data,
    count: response.payload.count
  );
;
// Button
            <Button
              vertical
              active=tab === 'trends'
              onPress=() => 
                this.setState( tab: 'trends' );
                this.reqTrends();
              
            >
              <Icon name="md-trending-up" />
              <Text>i18n.t('TRENDING')</Text>
            </Button>
// reqTrends
async reqTrends() 
    this.props.dispatch(getTrends());

预期结果:数据在后台加载,而用户仍然可以与其他元素交互

实际结果:用户必须等待请求完成才能使用其他任何东西

【问题讨论】:

【参考方案1】:

改变状态总是异步的。通过尝试以下操作设置状态后,您可能无法尝试继续进行 ajax 调用:

onPress=() => 
   this.setState( tab: 'trends' , () => this.reqTrends());

这可确保流程不会重叠或产生内存泄漏。

另一个因素是您通常应该将异步函数包装在 try/catch 块中。该错误可能出现在它自身的函数内部。

【讨论】:

刚刚试了下,还是卡住了。当我完成项目时,我通常将异步函数包装在 try/catch 块中,据我从控制台看到的,根本没有错误。

以上是关于使用 axios 向服务器发出请求会冻结 React Native 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 axios 向 SOAP 端点发出请求

无法从 reactjs 中的 axios 向 id=1 文章的 django REST API 后端发出 GET 请求

如何在 ExpressJS 中使用 axios?

发出多个 Axios 请求导致 CORS 错误

如何在 React 应用程序中使用 JEST 测试向 api 发出 axios 请求的异步函数

如何使用axios向img html标签发出视频流http GET请求?