如何禁用React Native请求超时 实现长耗时接口无超时调用
React Native 长请求超时解决方案
首先明确:React Native 自带的 fetch API 没有对外暴露超时配置项,无法直接禁用超时。你遇到的超时问题也不只是RN层的限制,还包含ngrok代理、移动端系统原生网络栈的默认超时限制,以下是可行的解决方案:
方案1:硬改超时配置适配8分钟长请求
如果你需要坚持用单次长连接等待服务端返回,按以下步骤调整:
- 首先修改ngrok的超时限制:免费版ngrok默认请求超时为30秒,启动时添加超时参数即可调整,8分钟对应480秒,启动命令改为:
付费版ngrok可以将参数设为ngrok http 5000 --request-timeout 480s--request-timeout 0实现无超时。 - 替换原生
fetch为axios发起请求,axios支持自定义超时时间,设为0即为无超时:- 安装依赖:
npm install axios - 修改你的请求代码:
import axios from 'axios' export default function App() { const [text,setText] = useState('') const [open,setOpen] = useState('') const [openrmse,setOpenrmse] = useState('') const [close,setClose] = useState('') const [closermse,setClosermse] = useState('') const [low,setLow] = useState('') const [lowrmse,setLowrmse] = useState('') const [high,setHigh] = useState('') const [highrmse,setHighrmse] = useState('') const [date,setDate] = useState('') const getData = async () => { console.log('http://127.0.0.1:5000/'+text); try { // timeout设为0即为无超时,也可显式设为480000对应8分钟 const response = await axios.get('https://******.ngrok.io/'+text, { timeout: 0 }); const json = response.data; setOpen(json.Open[0]); setOpenrmse(json.Open[1]); setClose(json.Close[0]) setClosermse(json.Close[1]); setLow(json.Low[0]); setLowrmse(json.Low[1]); setHigh(json.High[0]); setHighrmse(json.High[1]); setDate(json.time); } catch (error) { console.error(error); } } } - 安装依赖:
- (可选)如果调整后还是超时,需要修改原生端的默认网络超时:
- Android端:找到项目下的
android/app/src/main/java/[你的包名]/MainApplication.java,修改OkHttp初始化配置,将连接、读写超时都设为480秒 - iOS端:打开项目
ios/[你的项目名]/Info.plist,添加NSURLSession相关的超时配置,把默认超时调整为480秒
- Android端:找到项目下的
方案2:改用异步轮询模式(更推荐)
8分钟的长请求稳定性极低,很容易因为用户切后台、网络波动、系统资源回收等原因中断,建议改为异步任务模式,无需修改任何超时配置:
- 前端发起请求后,Flask服务端不需要同步等待处理完成,直接返回唯一的任务ID,立刻结束本次请求
- 前端拿到任务ID后,每隔10秒发起一次短请求查询任务处理状态
- 服务端处理完任务后,将结果存入缓存,当前端轮询到处理完成的状态时,直接返回最终结果
- 前端拿到结果后更新状态,结束轮询
这种方案稳定性远高于长连接,就算中间出现网络中断,重连后也可以继续查询任务进度,不需要重新触发8分钟的计算任务。
内容的提问来源于stack exchange,提问作者DevDog
相关产品推荐
相关产品推荐

