Axios 请求超时设置无效的问题及解决方案

在这里插入图片描述

文章目录

  • Axios 请求超时设置无效的问题及解决方案
    • 1. 引言
    • 2. 理解 Axios 的超时机制
      • 2.1 Axios 超时的工作原理
      • 2.2 超时错误的处理
    • 3. Axios 请求超时设置无效的常见原因
      • 3.1 配置错误或遗漏
      • 3.2 超时发生在建立连接之前
      • 3.3 使用了不支持的传输协议
      • 3.4 代理服务器或中间件干扰
      • 3.5 请求被拦截或修改
      • 3.6 环境或库版本不兼容
      • 3.7 使用了自定义的 Cancel Token 或其他中断机制
    • 4. 解决 Axios 请求超时设置无效的问题
      • 4.1 确保正确配置超时选项
      • 4.2 使用 Axios 实例进行配置
      • 4.3 实现自动重试机制
      • 4.4 结合使用其他超时方法
      • 4.5 检查和优化拦截器逻辑
      • 4.6 更新 Axios 和相关依赖
      • 4.7 避免在代理或中间件中拦截超时设置
    • 5. 示例实现
      • 5.1 基本超时设置
      • 5.2 使用 Axios 实例
      • 5.3 自动重试机制
      • 5.4 结合使用 AbortController
      • 5.5 清理拦截器
    • 6. 高级优化建议
      • 6.1 动态设置超时
      • 6.2 使用自定义超时逻辑
      • 6.3 集成重试库
      • 6.4 结合使用 Web Workers
    • 7. 总结

Axios 请求超时设置无效的问题及解决方案

1. 引言

在现代前端开发中,Axios 是一个广泛使用的 HTTP 客户端库,用于向服务器发送请求并处理响应。为了确保应用的健壮性和用户体验,开发者通常会为请求设置超时时间,以防止因网络问题或服务器响应缓慢导致的无限等待。然而,有时开发者可能会发现 Axios 的超时设置似乎无效,导致请求在超时后仍然继续执行,或者超时行为未按预期触发。本文将深入探讨 Axios 请求超时设置无效的常见原因,并提供详细的解决方案和最佳实践,帮助开发者有效地配置和调试 Axios 的超时机制。

2. 理解 Axios 的超时机制

2.1 Axios 超时的工作原理

Axios 提供了一个 timeout 配置选项,用于指定请求的最大等待时间(以毫秒为单位)。如果请求在指定的时间内未完成,Axios 将自动中止请求并抛出一个超时错误。

axios.get('/user/12345', {timeout: 5000 // 5秒超时
})
.then(response => {console.log(response.data);
})
.catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败:', error.message);}
});

2.2 超时错误的处理

当请求超时时,Axios 会抛出一个错误对象,其 code 属性为 'ECONNABORTED',并包含超时的相关信息。开发者可以通过捕获该错误来进行相应的处理,例如提示用户重试或记录日志。

3. Axios 请求超时设置无效的常见原因

3.1 配置错误或遗漏

原因描述:未正确设置 timeout 配置选项,或在错误的位置设置了超时。

解决方案

  • 确保 timeout 配置项以毫秒为单位正确设置。
  • 确保 timeout 配置在正确的位置,例如全局配置或请求级别配置。

示例

// 全局配置
axios.defaults.timeout = 5000; // 5秒// 请求级别配置
axios.get('/user/12345', {timeout: 5000
});

3.2 超时发生在建立连接之前

原因描述Axiostimeout 选项仅适用于请求的建立和响应过程,不包括 DNS 查询、TCP 连接建立等低层次的网络操作。因此,如果问题出在这些阶段,超时设置可能无法生效。

解决方案

  • 使用网络代理或 VPN 进行网络调试,确保 DNS 和 TCP 连接的稳定性。
  • 优化服务器的网络响应时间,减少建立连接所需的时间。

3.3 使用了不支持的传输协议

原因描述Axios 主要支持 HTTP 和 HTTPS 协议。如果使用其他传输协议(如 WebSocket),timeout 设置可能不会生效。

解决方案

  • 确保请求使用的是 Axios 支持的 HTTP 或 HTTPS 协议。
  • 对于需要其他协议的场景,使用适合的客户端库并实现相应的超时机制。

3.4 代理服务器或中间件干扰

原因描述:网络中存在代理服务器、防火墙或其他中间件,可能会延迟或阻止请求,从而影响超时设置的效果。

解决方案

  • 检查并配置代理服务器,确保其不会无故延迟或阻止请求。
  • 在必要时,调整代理服务器的超时设置,使其与 Axios 的超时配置保持一致。

3.5 请求被拦截或修改

原因描述:使用了 Axios 的拦截器(interceptors),在请求或响应阶段进行了拦截和修改,可能导致超时设置失效。

解决方案

  • 仔细检查请求和响应拦截器,确保它们不会意外地延迟或阻止请求的完成。
  • 在拦截器中处理超时逻辑,确保与 Axios 的超时机制兼容。

示例

// 请求拦截器
axios.interceptors.request.use(config => {// 例如,添加自定义头部config.headers['X-Custom-Header'] = 'foobar';return config;
}, error => {return Promise.reject(error);
});// 响应拦截器
axios.interceptors.response.use(response => {// 例如,处理特定的响应格式return response;
}, error => {// 确保超时错误被正确传递return Promise.reject(error);
});

3.6 环境或库版本不兼容

原因描述:使用的 Axios 版本与其他依赖库或运行环境存在兼容性问题,可能导致超时设置无法正常工作。

解决方案

  • 确保使用的是 Axios 的最新稳定版本。
  • 检查并更新其他相关库,确保它们与 Axios 兼容。
  • 在不同环境(如浏览器、Node.js)中测试超时设置,确认其一致性。

3.7 使用了自定义的 Cancel Token 或其他中断机制

原因描述:在请求中使用了 AxiosCancelToken 或其他中断机制,可能与超时设置冲突,导致超时行为未按预期触发。

解决方案

  • 确保 CancelToken 的使用不会干扰 Axios 的超时机制。
  • 在实现自定义中断逻辑时,明确区分超时引发的中断和其他类型的中断。

示例

const source = axios.CancelToken.source();axios.get('/user/12345', {timeout: 5000,cancelToken: source.token
})
.then(response => {console.log(response.data);
})
.catch(error => {if (axios.isCancel(error)) {console.log('请求被取消:', error.message);} else if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败:', error.message);}
});// 在需要时取消请求
source.cancel('操作被用户取消');

4. 解决 Axios 请求超时设置无效的问题

4.1 确保正确配置超时选项

步骤

  1. 全局配置:在 Axios 的默认配置中设置 timeout,适用于所有请求。
  2. 请求级别配置:在单个请求中设置 timeout,覆盖全局配置。

示例

// 全局配置
axios.defaults.timeout = 5000; // 5秒超时// 请求级别配置
axios.get('/user/12345', {timeout: 10000 // 10秒超时
});

注意:请求级别的配置会覆盖全局配置。

4.2 使用 Axios 实例进行配置

步骤

  1. 创建一个 Axios 实例,并在实例中设置 timeout
  2. 使用该实例发送请求,确保所有请求都应用相同的超时设置。

示例

const axiosInstance = axios.create({baseURL: 'https://api.example.com',timeout: 5000, // 5秒超时headers: { 'X-Custom-Header': 'foobar' }
});axiosInstance.get('/user/12345').then(response => {console.log(response.data);}).catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败:', error.message);}});

4.3 实现自动重试机制

步骤

  1. 当请求超时时,自动尝试重新发送请求。
  2. 设置最大重试次数,防止无限重试。

示例

function axiosWithRetry(url, options, retries = 3) {return axios.get(url, options).catch(error => {if (retries > 0 && error.code === 'ECONNABORTED') {console.warn(`请求超时,正在重试... 剩余重试次数:${retries}`);return axiosWithRetry(url, options, retries - 1);}return Promise.reject(error);});
}axiosWithRetry('/user/12345', { timeout: 5000 }).then(response => {console.log(response.data);}).catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时,所有重试均失败!');} else {console.error('请求失败:', error.message);}});

4.4 结合使用其他超时方法

步骤

  1. Axiostimeout 基础上,使用 AbortController 来实现更细粒度的超时控制。
  2. 适用于现代浏览器和 Node.js 环境。

示例

const controller = new AbortController();
const timeout = setTimeout(() => {controller.abort();
}, 5000); // 5秒超时axios.get('/user/12345', {signal: controller.signal
})
.then(response => {clearTimeout(timeout);console.log(response.data);
})
.catch(error => {if (axios.isCancel(error)) {console.error('请求被取消:', error.message);} else {console.error('请求失败:', error.message);}
});

4.5 检查和优化拦截器逻辑

步骤

  1. 仔细检查请求和响应拦截器,确保它们不会无意中延迟请求或阻止超时行为。
  2. 在拦截器中处理错误时,确保不覆盖或忽略超时错误。

示例

// 请求拦截器
axios.interceptors.request.use(config => {// 添加自定义逻辑return config;
}, error => {return Promise.reject(error);
});// 响应拦截器
axios.interceptors.response.use(response => {// 添加自定义逻辑return response;
}, error => {// 确保超时错误被正确传递if (error.code === 'ECONNABORTED') {console.error('请求超时!');}return Promise.reject(error);
});

4.6 更新 Axios 和相关依赖

步骤

  1. 确保使用的是 Axios 的最新稳定版本,修复已知的超时问题。
  2. 更新其他相关依赖库,确保它们与 Axios 兼容。

命令

npm install axios@latest

4.7 避免在代理或中间件中拦截超时设置

原因描述:某些代理服务器或中间件可能会修改请求或响应,影响 Axios 的超时行为。

解决方案

  • 检查并配置代理服务器,确保其不会无故延迟或修改请求和响应。
  • 在本地开发环境中,尽量减少使用代理或中间件,确认问题是否由它们引起。

5. 示例实现

5.1 基本超时设置

代码示例

axios.get('https://api.example.com/data', {timeout: 5000 // 5秒超时
})
.then(response => {console.log('数据接收成功:', response.data);
})
.catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败:', error.message);}
});

5.2 使用 Axios 实例

代码示例

const axiosInstance = axios.create({baseURL: 'https://api.example.com',timeout: 7000, // 7秒超时headers: { 'X-Custom-Header': 'foobar' }
});axiosInstance.get('/data').then(response => {console.log('数据接收成功:', response.data);}).catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败:', error.message);}});

5.3 自动重试机制

代码示例

function axiosWithRetry(url, options, retries = 2) {return axios.get(url, options).catch(error => {if (retries > 0 && error.code === 'ECONNABORTED') {console.warn(`请求超时,正在重试... 剩余重试次数:${retries}`);return axiosWithRetry(url, options, retries - 1);}return Promise.reject(error);});
}axiosWithRetry('https://api.example.com/data', { timeout: 5000 }).then(response => {console.log('数据接收成功:', response.data);}).catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时,所有重试均失败!');} else {console.error('请求失败:', error.message);}});

5.4 结合使用 AbortController

代码示例

const controller = new AbortController();
const timeoutId = setTimeout(() => {controller.abort();
}, 5000); // 5秒超时axios.get('https://api.example.com/data', {signal: controller.signal
})
.then(response => {clearTimeout(timeoutId);console.log('数据接收成功:', response.data);
})
.catch(error => {if (axios.isCancel(error)) {console.error('请求被取消:', error.message);} else {console.error('请求失败:', error.message);}
});

5.5 清理拦截器

代码示例

// 添加拦截器
const requestInterceptor = axios.interceptors.request.use(config => {// 添加自定义逻辑return config;
}, error => {return Promise.reject(error);
});const responseInterceptor = axios.interceptors.response.use(response => {// 添加自定义逻辑return response;
}, error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');}return Promise.reject(error);
});// 移除拦截器
axios.interceptors.request.eject(requestInterceptor);
axios.interceptors.response.eject(responseInterceptor);

6. 高级优化建议

6.1 动态设置超时

场景:根据请求的性质或优先级,动态调整不同请求的超时时间。

代码示例

function fetchData(endpoint, isCritical = false) {const timeout = isCritical ? 10000 : 5000; // 关键请求超时 10秒,其他请求 5秒return axios.get(endpoint, { timeout }).then(response => response.data).catch(error => {if (error.code === 'ECONNABORTED') {console.error(`请求 ${endpoint} 超时!`);} else {console.error(`请求 ${endpoint} 失败:`, error.message);}throw error;});
}fetchData('/critical-data', true).then(data => {console.log('关键数据接收成功:', data);}).catch(error => {// 处理错误});

6.2 使用自定义超时逻辑

场景:在 Axios 的基础上,结合自定义逻辑实现更复杂的超时控制,例如基于条件的超时取消。

代码示例

function fetchWithCustomTimeout(url, options, conditionFn, timeout = 5000) {const controller = new AbortController();const timeoutId = setTimeout(() => {controller.abort();}, timeout);return axios.get(url, {...options,signal: controller.signal}).then(response => {clearTimeout(timeoutId);if (conditionFn(response.data)) {return response.data;} else {throw new Error('条件不满足');}}).catch(error => {clearTimeout(timeoutId);throw error;});
}fetchWithCustomTimeout('/data',{},data => data.isValid === true,7000 // 7秒超时
)
.then(data => {console.log('数据接收成功且条件满足:', data);
})
.catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时!');} else {console.error('请求失败或条件不满足:', error.message);}
});

6.3 集成重试库

场景:使用第三方重试库(如 axios-retry)实现更智能的重试机制,包括指数退避和错误过滤。

代码示例

import axios from 'axios';
import axiosRetry from 'axios-retry';// 配置 Axios 重试
axiosRetry(axios, {retries: 3, // 最大重试次数retryDelay: (retryCount) => {return retryCount * 1000; // 每次重试延迟增加},retryCondition: (error) => {// 只在超时或网络错误时重试return axiosRetry.isNetworkOrIdempotentRequestError(error) || error.code === 'ECONNABORTED';},
});// 发起请求
axios.get('https://api.example.com/data', { timeout: 5000 }).then(response => {console.log('数据接收成功:', response.data);}).catch(error => {if (error.code === 'ECONNABORTED') {console.error('请求超时,所有重试均失败!');} else {console.error('请求失败:', error.message);}});

6.4 结合使用 Web Workers

场景:在处理大量数据或复杂计算时,使用 Web Workers 将超时检测逻辑从主线程分离,避免阻塞 UI。

代码示例

// worker.js
self.onmessage = function(e) {const { url, timeout } = e.data;fetch(url).then(response => response.json()).then(data => {self.postMessage({ status: 'success', data });}).catch(error => {self.postMessage({ status: 'error', error: error.message });});// 超时处理setTimeout(() => {self.postMessage({ status: 'timeout' });}, timeout);
};// main.js
const worker = new Worker('worker.js');worker.postMessage({ url: 'https://api.example.com/data', timeout: 5000 });worker.onmessage = function(e) {const { status, data, error } = e.data;if (status === 'success') {console.log('数据接收成功:', data);} else if (status === 'timeout') {console.error('请求超时!');} else if (status === 'error') {console.error('请求失败:', error);}
};

7. 总结

Axios 的超时设置是确保应用在网络不稳定或服务器响应缓慢时保持健壮性的关键配置。然而,若超时设置无效,可能会导致请求无限等待或错误处理不当,从而影响用户体验。通过理解 Axios 超时机制的工作原理,识别常见的配置和环境问题,并采用适当的解决方案和最佳实践,开发者可以有效地配置和调试 Axios 的超时行为。

关键措施包括

  • 正确配置超时选项:确保 timeout 设置在正确的位置,并以毫秒为单位。
  • 使用 Axios 实例:集中管理配置,避免配置遗漏。
  • 实现自动重试机制:提高请求的鲁棒性,处理偶发的网络问题。
  • 结合使用其他超时方法:如 AbortController,实现更细粒度的控制。
  • 优化拦截器逻辑:确保拦截器不会干扰超时行为。
  • 更新 Axios 和相关依赖:保持使用最新的稳定版本,避免已知的兼容性问题。
  • 避免代理或中间件干扰:确保网络环境支持 Axios 的超时设置。
  • 监控和调试:使用开发者工具和日志,实时监控请求的超时行为,及时发现和解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461607.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF+MVVM案例实战(十五)- 实现一个下拉式菜单(上)

文章目录 1 案例效果2、图标资源下载3、功能实现1.文件创建2、菜单原理分析3、一级菜单两种样式实现1、一级菜单无子项样式实现2、一级菜单有子项样式实现 4、总结 1 案例效果 提示 2、图标资源下载 从阿里矢量素材官网下载需要的菜单图片,如下所示: …

【环境搭建】Apache ZooKeeper 3.8.4 Stable

软件环境 Ubuntu 20.04 、OpenJDK 11 OpenJDK 11(如果已经安装,可以跳过这一步) 安装OpenJDK 11: $ sudo apt-get update$ sudo apt-get install -y openjdk-11-jdk 设置 JAVA_HOME 环境变量: $ sudo gedit ~/.bash…

后台管理系统的通用权限解决方案(九)SpringBoot整合jjwt实现登录认证鉴权

1&#xff09;创建maven工程jjwt-login-demo&#xff0c;并配置其pom.xml文件如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-ins…

国考报名照片无法使用照片审核工具上传失败的解决办法

国考报名过程中&#xff0c;照片审核是至关重要的一步&#xff0c;但许多考生在上传照片时遇到了难题&#xff0c;导致无法继续报名&#xff0c;从而影响抢考场位置&#xff0c;下面就介绍如何快速完成照片处理、审核和上传过审的技巧。 一、国考报名照片基本要求首先&#xff…

vue中如何为不同功能设置不同的默认打印设置(设置不同的打印机)

浏览器自带的window.print 功能较简单&#xff0c;这里使用LODOP露肚皮打印 以下是vue2示例&#xff1a; 从官网中下载Lodop和C-Lodop官网主站安装包并安装到本地电脑可以全局搜索电脑找到安装文件LodopFuncs.js&#xff0c;也可以直接复制我贴出来的文件 //用双端口加载主JS…

数据库管理系统的ACID都各自是什么?

本文基于DBMS中ACID属性的概念&#xff0c;这些属性保证了数据库中执行事务时保持数据一致性、完整性和可靠性所。事务是访问并可能修改数据库内容的单一逻辑工作单元。交易使用读写操作访问数据。为了保持数据库的一致性&#xff0c;在事务前后&#xff0c;遵循某些属性。这些…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

OB_GINS_day3

这里写目录标题 实现当前状态初始化实现预积分的初始化由于此时preintegration_options 是3&#xff08;也就是考虑odo以及earth rotation&#xff09;为预积分的容器添加需要积分的IMU积分因子接下来是添加新的IMU到preintegration中 实现当前状态初始化 这个state_curr的主要…

如何优化kafka和mysql处理百万级消息计算和落库

一.业务场景 最近业务需要&#xff0c;做了性能优化操作。百万级消息在kafka中秒级传输。cpu密集计算分钟级完成&#xff0c;然后在mysql中秒级落库.模型cpu计算提高了1倍&#xff0c;落表速度提高了5倍&#xff0c;2分钟内完成. 如下序列图&#xff1a; 业务系统A发送千级别…

深度学习基础知识-Batch Normalization(BN)超详细解析

一、背景和问题定义 在深层神经网络&#xff08;Deep Neural Networks, DNNs&#xff09;中&#xff0c;层与层之间的输入分布会随着参数更新不断发生变化&#xff0c;这种现象被称为内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;。具体来说&#xff0c;由…

NLP算法工程师精进之路:顶会论文研读精华

1.学术能力培养 全部论文资料下载&#xff1a; 将论文和 GitHub 资源库匹配 papers with code https://paperswithcode.com/OpenGitHub 新项目快报Github pwc&#xff1a;https://github.com/zziz/pwc GitXiv&#xff1a;http://www.gitxiv.com/ 文章撰写 Overleaf [Autho…

从倍压整流到二极管钳位与限幅

何为倍压整流&#xff1f;这里直接引用“百度百科”解释&#xff0c;如下述。 在一些需用高电压、小电流的地方&#xff0c;常常使用倍压整流电路。倍压整流&#xff0c;可以把较低的交流电压&#xff0c;用耐压较高的整流二极管和电容器&#xff0c;“整”出一个较高的直流电…

Java项目实战II基于Java+Spring Boot+MySQL的工程教育认证的计算机课程管理平台(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着工程教…

uniapp开发小程序【简单的实现点击下拉选择性别功能】

一、展示效果 二、代码 <template><view><view class="form_box"><view class="item"

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

Flutter Color 大调整,需适配迁移,颜色不再是 0-255,而是 0-1.0,支持更大色域

在之前的 3.10 里&#xff0c; Flutter 的 Impeller 在 iOS 上支持了 P3 广色域图像渲染&#xff0c;但是当时也仅仅是当具有广色域图像或渐变时&#xff0c;Impeller 才会在 iOS 上显示 P3 的广色域的颜色&#xff0c;而如果你使用的是 Color API&#xff0c;会发现使用的还是…

动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙

许多企业正面临由混合和多云环境运营复杂性所引发的危机&#xff0c;它们普遍耗巨资于物理和虚拟设备的持续维护、修补和升级上&#xff0c;而针对不同云环境下的应用部署则需要特有的技能来管理众多繁杂的工具和服务。为助力企业应对上述挑战&#xff0c;F5公司发布了BIG-IP N…

如何用Python同时抓取多个网页:深入ThreadPoolExecutor

背景介绍 在信息化时代&#xff0c;数据的实时性和获取速度是其核心价值所在。对于体育赛事爱好者、数据分析师和投注行业而言&#xff0c;能否快速、稳定地抓取到实时比赛信息显得尤为重要。特别是在五大足球联赛中&#xff0c;能够在比赛进行时获得比分、控球率等实时数据&a…

(转载)Tools for Learning LLVM TableGen

前提 最近在学习有关llvm的东西&#xff0c;其中TableGen占了一部分&#xff0c;所以想特意学习下TableGen相关的语法。这里找到了LLVM官网的一篇介绍TableGen的博客&#xff0c;学习并使用机器翻译为中文。在文章的最后也添加了一些学习TableGen的资源。 原文地址&#xff1…

LARGE SCALE GAN TRAINING FORHIGH FIDELITY NATURAL IMAGE SYNTHESIS

ABSTRACT 尽管最近在生成图像建模方面取得了进展&#xff0c;但成功地从复杂的数据集(如ImageNet)生成高分辨率、多样化的样本仍然是一个难以实现的目标。为此&#xff0c;我们在迄今为止尝试的最大规模上训练生成对抗网络&#xff0c;并研究这种规模特有的不稳定性。我们发现…