前端异步任务处理总结

一、异步任务常见场景

  1. 网络请求fetch()axios 等 API 调用

  2. 定时操作setTimeoutsetInterval

  3. 用户交互:事件监听回调

  4. 资源加载:图片/脚本动态加载

  5. Web Workers:后台线程计算

二、核心处理方案

1. Promise(ES6+)
function fetchUser(id) {return new Promise((resolve, reject) => {fetch(`/api/users/${id}`).then(response => response.json()).then(resolve).catch(reject)})
}// 使用示例
fetchUser(123).then(user => console.log(user)).catch(error => console.error(error))
2. async/await(ES2017+)
async function getUserData() {try {const user = await fetchUser(123)const posts = await fetchPosts(user.id)return { user, posts }} catch (error) {console.error('数据获取失败:', error)return null}
}// 调用
getUserData().then(console.log)
3. Promise 组合方法
方法特点使用场景
Promise.all()全部成功才返回,短路失败强依赖的并行请求
Promise.allSettled()等待所有完成,返回状态详情独立任务的结果收集
Promise.race()返回第一个完成的结果请求超时控制
Promise.any()返回第一个成功的结果多源数据择优

Promise.allSettled() 示例

const promise1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 1');}, 1000);
});const promise2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 2');}, 2000);
});const promise3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('Promise 3');}, 3000);
});Promise.allSettled([promise1, promise2, promise3]).then(results => {  results.forEach(result => {  if(result.status === 'fulfilled') {  console.log('成功获取值:', result.value);  } else {  console.error('拒绝原因:', result.reason);  }  });  });

三、高级处理模式

1. 请求竞速(race)
function withTimeout(promise, timeout) {return Promise.race([promise,new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout))])
}// 使用
withTimeout(fetch('/api/data'), 5000).catch(error => console.error(error))
2. 顺序执行 + 并行组合
async function processOrder(orderId) {// 顺序执行const order = await fetchOrder(orderId)const user = await fetchUser(order.userId)// 并行执行const [product, address] = await Promise.all([fetchProduct(order.productId),fetchAddress(user.addressId)])return { order, user, product, address }
}
3. 错误重试机制
async function retry(fn, retries = 3, delay = 1000) {try {return await fn()} catch (err) {if (retries <= 0) throw errawait new Promise(res => setTimeout(res, delay))return retry(fn, retries - 1, delay * 2) // 指数退避}
}// 使用
retry(() => fetch('/unstable-api'))

四、实际应用技巧

加载状态管理

async function loadData() {setLoading(true)try {const data = await fetchData()setState(data)} catch (error) {setError(error.message)} finally {setLoading(false)}
}

并发控制(避免同时发起过多请求):

async function parallelWithLimit(tasks, limit) {const results = []const executing = []for (const task of tasks) {const p = task().then(res => {executing.splice(executing.indexOf(p), 1)return res})results.push(p)executing.push(p)if (executing.length >= limit) {await Promise.race(executing)}}return Promise.all(results)
}// 使用:最多同时3个请求
parallelWithLimit([task1, task2, ...task10], 3)

五、最佳实践

  1. 始终捕获错误:使用 try/catch 或 .catch()

  2. 避免嵌套地狱:优先使用 async/await 替代回调嵌套

  3. 合理使用并行:独立任务用 Promise.all() 或 Promise.allSettled()

  4. 添加取消机制:对长时间操作提供取消支持

  5. 性能优化

    • 请求合并(GraphQL/BFF)

    • 数据缓存(SWR/React Query)

    • 懒加载非关键资源

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

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

相关文章

机器学习第三课之逻辑回归(二)LogisticRegression

目录 简介 一.分类评估⽅法 1.混淆矩阵 2.精确率(Precision)与召回率(Recall) 3.F1-score 4.分类评估报告api 2.正则化惩罚 3.⽋拟合和过拟合 4.K折交叉验证 5.代码分析 简介 接上一篇博客最后 机器学习第二课之逻辑回归&#xff08;一&#xff09;LogisticRegres…

基于ELK Stack的实时日志分析与智能告警实践指南

基于ELK Stack的实时日志分析与智能告警实践指南 一、业务场景描述 在生产环境中&#xff0c;服务实例数量众多&#xff0c;日志量激增&#xff0c;传统的文本 grep 或 SSH 登录方式已无法满足实时监控与故障定位需求。我们需要搭建一个可扩展、低延迟的日志收集与分析平台&…

需求变更过程中出现的团队资源冲突问题处理的一些小技巧

​​一、资源冲突的典型场景​​ ​​技术资源争夺​​:多个需求同时需要同一开发人员或技术专家支持 ​​人力资源过载​​:突发需求导致团队成员工作量超负荷(如同时处理3个紧急需求) ​​设备/环境冲突​​:测试服务器资源不足或特定开发工具许可证被占用 ​​跨团队协…

基于Matlab图像处理的液晶显示器表面缺陷检测与分类研究

本课题设计并实现了一种基于 MATLAB 的图像缺陷检测系统&#xff0c;系统集成中值滤波、对比度增强、梯度检测与区域分析等图像处理技术&#xff0c;能够对图像中的点状、线状和块状缺陷进行有效识别与分类。用户可通过图形用户界面&#xff08;GUI&#xff09;导入待测图像&am…

prometheus应用demo(一)接口监控

目录 完整代码&#xff08;纯Cursor生成&#xff09; 1、pom 2、配置和启动类 3、自定义指标bean 4、上报 5、业务代码 一、统计API请求&#xff08;次数、响应码等&#xff09; 1、统计总数 关键代码&#xff1a; &#xff08;1&#xff09;自定义指标DTO &#xff0…

逃离智能家居“孤岛”!用 Home Assistant 打造你的全屋互联自由王国

文章目录&#x1f914; 痛点暴击&#xff1a;智能家居的“巴别塔困境”&#x1f6e0;️ Home Assistant 是个啥&#xff1f;简单粗暴版定义&#x1f50d; 硬核拆解&#xff1a;Home Assistant 的魅力之源&#x1f680; 上车指南&#xff1a;如何开始你的 HA 之旅&#xff1f;第…

数据结构:如何判断一个链表中是否存在环(Check for LOOP in Linked List)

目录 初始思考&#xff1a;什么叫“链表有环”&#xff1f; ❌ 第一种直接想法&#xff08;失败&#xff09;&#xff1a;我们是不是能“记住走过的节点”&#xff1f; 那我们换一个思路&#xff1a;我们能否只用两个指针来检测环&#xff1f; 第一步&#xff1a;定义两个指…

深入理解Java的SPI机制,使用auto-service库优化SPI

文章目录一、简介二、使用1、服务提供者&#xff08;或者第三方公共&#xff09;&#xff1a;定义接口2、服务提供者&#xff1a;定义实现类3、服务提供者&#xff1a;注册服务4、构建服务提供者jar包5、客户端&#xff1a;使用 ServiceLoader 来加载服务三、源码分析1、源码2、…

PPT自动化 python-pptx - 10 : 表格(tables)

在日常工作中&#xff0c;我们经常需要制作包含表格的 PowerPoint 演示文稿&#xff0c;以此清晰展示数据或文本信息。手动制作不仅耗时&#xff0c;当数据更新时还需重复操作&#xff0c;效率低下。而 python-pptx 库为我们提供了自动化操作 PowerPoint 表格的可能。本文将详细…

在安卓中使用 FFmpegKit 剪切视频并添加文字水印

在安卓中用到的三方库&#xff1a;https://github.com/arthenica/ffmpeg-kit 这个库很强大&#xff0c;支持很多平台&#xff0c;每个平台都有各自的分支代码&#xff0c;用了一段时间&#xff0c;稳定性挺好的&#xff0c; 找到安卓下的分支&#xff1a;FFmpegKit for Andro…

Flask + HTML 项目开发思路

Flask HTML 项目开发思路&#xff1a;以公共资源交易信息展示为例 一、开篇明义——为什么选 Flask 框架 在众多 Python Web 框架&#xff08;如 Django、Tornado 等&#xff09;里&#xff0c;本次项目坚定选择 Flask&#xff0c;背后有清晰的技术考量&#xff1a; 1. 轻量…

Vue中:deep()和 ::v-deep选择器的区别

在 Vue.js 中&#xff0c;:deep()和 ::v-deep都是用于穿透组件作用域的深度选择器&#xff0c;但它们在语法、适用场景和版本支持上存在区别。以下是两者的核心差异&#xff1a;一、​​语法与用法​ &#xff1a;Vue2中用 ::v-deep&#xff0c;Vue2中不支持:deep()&#xff0c…

Deep learning based descriptor

1、DH3D: Deep Hierarchical 3D Descriptors for Robust Large-Scale 6DoF Relocalization 论文链接 代码链接 这是一篇训练点云的文章&#xff0c;在训练出local descriptor之后&#xff0c;通过聚类的方法得出global descriptor&#xff0c;并且提出了hierarchical network&…

PandasAI连接LLM对MySQL数据库进行数据分析

1. 引言 在之前的文章《PandasAI连接LLM进行智能数据分析》中实现了使用PandasAI连接与DeepSeek模型通过自然语言进行数据分析。不过那个例子中使用的是PandasAI 2.X&#xff0c;并且使用的是本地.csv文件来作为数据。在实际应用的系统中&#xff0c;使用.csv作为库表的情况比…

FloodFill算法——DFS

FloodFill算法就是用来寻找性质相同的连通快的算法&#xff0c;这篇博客都是用dfs来实现FloodFill算法 1.图像渲染 题目链接&#xff1a;733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;将和&#xff08;sr,sc&#xff09;相连的所有像素相同的…

【BUUCTF系列】[极客大挑战 2019]LoveSQL 1

本文仅用于技术研究&#xff0c;禁止用于非法用途。 Author:枷锁 文章目录一、题目核心漏洞分析二、关键解题步骤与技术解析1. 确定列数&#xff08;ORDER BY&#xff09;2. 联合查询获取表名3. 爆破字段名4. 提取Flag三、漏洞根源与防御方案1. 漏洞成因2. 防御措施四、CTF技巧…

AI时代,童装销售的“指路明灯”

别看现在AI、大数据这些词眼花缭乱的&#xff0c;当年我刚入行那会儿&#xff0c;也跟你一样&#xff0c;对着一堆库存和销量数据发愁&#xff0c;不知道劲儿该往哪使。童装销售这行&#xff0c;看着简单&#xff0c;其实水挺深。不过呢&#xff0c;这二十多年摸爬滚打下来&…

Swin-Transformer从浅入深详解

第一部分&#xff1a;出现背景在 Swin Transformer 出现之前&#xff0c;计算机视觉&#xff08;Computer Vision, CV&#xff09;领域主要由 CNN (卷积神经网络) 主导。后来&#xff0c;NLP&#xff08;自然语言处理&#xff09;领域的 Transformer 模型被引入 CV&#xff0c;…

如何手动打包 Linux(麒麟系统)的 Qt 程序

gcc版本 gcc版本确保目标系统&#xff08;运行环境&#xff09;的 GCC 版本 高于或等于开发环境的版本&#xff0c;否则程序无法在目标平台运行。通过 gcc -v 可查看当前版本。cmake生成可执行文件 强烈建议在cmakelists添加设置运行时 rpath 为 $ORIGIN/…/lib&#xff08;相对…

解决 “crypto.hash is not a function”:Vite 从 6.x 升级至 7.x 后 `pnpm run dev` 报错问题

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …