javascript - 使用 axios 向服务器发出请求会卡住 React Native 应用程

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

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

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());
}

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

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

最佳答案

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

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

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

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

关于javascript - 使用 axios 向服务器发出请求会卡住 React Native 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182607/

相关文章:

amazon-web-services - 使用 aws sts assume-role 配置 AW

npm - 在私有(private)网络上托管 github 发布

node.js - TransferHttpCacheModule 不会阻止 Angular 8 中

json - 将选定的内容模型及其内容导出到 Contentful 中的另一个空间

node.js - 如何在模块加载到 NodeJS 之前获取和使用 Secret Manager 值

node.js - 如何在 node 中集成 swagger 和 fastify 框架

reactjs - 使用 React Router V4 时如何防止组件立即卸载

firebase - 我应该使用 Firebase 动态链接而不是通用链接和应用链接吗?

php - 在电子邮件中添加 PhpSpreadsheet 附件

java - 如何使用 .p8 文件签署 json 网络 token