尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Promise中处理请求超时问题

Promise中处理请求超时问题
📅 发布时间:2026/6/20 9:08:47

1. 使用 Promise.race() 处理超时Promise

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<title>promise-ajax</title>
</head>
<body>
<script type="text/javascript">// Create a timeout promise
function timeoutPromise(ms) {return new Promise((_, reject) => {setTimeout(() => reject(new Error('Request timeout')), ms);});
}// Fetch with timeout using Promise.race
async function fetchDataWithTimeout(url, timeout = 5000) {try {const response = await Promise.race([fetch(url),timeoutPromise(timeout)]);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const data = await response.text();return data;} catch (error) {console.error('Fetch error:', error);throw error;}
}// Usage
async function useWithTimeout() {try {const url = 'http://localhost:30000/test/slow';const result = await fetchDataWithTimeout(url, 3000); // 3 second timeoutconsole.log('Result:', result);} catch (error) {if (error.message === 'Request timeout') {console.error('Request timed out!');} else {console.error('Other error:', error);}}
}useWithTimeout();</script></body>
</html>

以上代码,设置超时时间为3秒,请求后3秒没有收到接口响应结果,就会结束请求。

2.使用 AbortController终止promise请求

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<title>promise-ajax</title>
</head>
<body>
<script type="text/javascript">async function fetchDataWithAbort(url, timeout = 5000) {const controller = new AbortController();const timeoutId = setTimeout(() => controller.abort(), timeout);try {const response = await fetch(url, {signal: controller.signal});clearTimeout(timeoutId);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const data = await response.text();return data;} catch (error) {clearTimeout(timeoutId);if (error.name === 'AbortError') {throw new Error('Request timeout');}console.error('Fetch error:', error);throw error;}
}// Usage
async function useWithAbort() {try {const url = 'http://localhost:30000/test/slow';const result = await fetchDataWithAbort(url, 3000); // 3 second timeoutconsole.log('Result:', result);} catch (error) {if (error.message === 'Request timeout') {console.error('Request timed out!');} else {console.error('Other error:', error);}}
}useWithAbort();</script></body>
</html>

同理,设置超时时间为3秒,请求后3秒没有收到接口响应结果,就会结束请求。

3.使用超时和重试次数来处理

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<title>promise-ajax</title>
</head>
<body>
<script type="text/javascript">// Async function that returns a value
async function fetchWithRetryAndTimeout(url, options = {}) {const { timeout = 5000, retries = 3, retryDelay = 1000 } = options;for (let i = 0; i <= retries; i++) {try {const controller = new AbortController();const timeoutId = setTimeout(() => controller.abort(), timeout);try {const response = await fetch(url, {signal: controller.signal,...options});clearTimeout(timeoutId);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const data = await response.text();return data;} catch (error) {clearTimeout(timeoutId);if (error.name === 'AbortError') {throw new Error('Request timeout');}throw error;}} catch (error) {console.log(`Attempt ${i + 1} failed:`, error.message);if (i === retries) {throw new Error(`Failed after ${retries + 1} attempts: ${error.message}`);}// Wait before retryingawait new Promise(resolve => setTimeout(resolve, retryDelay));}}
}// Usage
async function useWithRetry() {try {const url = 'http://localhost:30000/test/slow';const result = await fetchWithRetryAndTimeout(url, {timeout: 3000,retries: 3,retryDelay: 1000});console.log('Result:', result);} catch (error) {console.error('Final error:', error.message);}
}useWithRetry();
</script></body>
</html>

以上代码,设置超时时间为3秒,请求间隔为1s,第一次请求失败后重试3次,如果重试3次后依然识别,就会结束请求。

相关新闻

  • AI驱动建筑行业数字化转型
  • VSCode 把代码发送到激活状态下的终端
  • 线性结构之数组[基于郝斌课程]

最新新闻

  • 潍坊黄金回收实测避坑,六家老店哪家靠谱 - 余生黄金回收
  • Appium Inspector 实战指南:iOS自动化测试元素定位与脚本编写
  • 邵阳黄金回收测评:这6家店到底怎么选? - 余生黄金回收
  • 3分钟掌握BoxMOT:终极多目标追踪插件化解决方案
  • 2026年6月最新卡地亚中国官方售后服务地址客服热线网点电话 - 卡地亚服务中心
  • MC68F375微控制器寄存器配置与TPU3时序引擎深度解析

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号