JS异步地狱避坑:Promise与async/await容易踩的 5 个坑
做前端开发几乎天天和异步打交道。不管是接口请求、定时器、文件处理到处都有异步逻辑。早期全靠回调函数嵌套多了就形成回调地狱代码层层缩进维护起来相当痛苦。Promise 的出现解决了回调嵌套的问题后来 ES2017 推出 async/await基于 Promise 做语法糖写异步代码看起来和同步代码几乎一样上手门槛很低。但语法简单不等于不会踩坑。我见过不少同事写的代码表面上跑起来没问题一旦遇到接口报错、并发量大的时候各种诡异 bug 就冒出来异常悄无声息丢失、接口并发乱序、await 之后代码不按预期执行。很多问题控制台还不会直接报明显错误排查问题要花很久。下面结合实际业务场景盘点 5 个高频踩坑点每个坑都放上错误示例和修复后的代码。坑 1忘记 try‑catch异步异常直接静默丢失这应该是最高频的错误。很多人以为写了 async/await报错就会自动抛出来如果不包 try‑catchPromise 内部 reject 异常会变成未捕获的 Promise 错误部分场景甚至业务逻辑直接中断。错误代码示例// 模拟接口请求随机抛出异常 function fetchUserInfo() { return new Promise((resolve, reject) { setTimeout(() { const errFlag true; if(errFlag) { reject(new Error(获取用户信息接口报错)); }else{ resolve({name:张三}); } }, 800) }) } async function getUser() { // 没有try catchreject之后抛出未捕获异常 const res await fetchUserInfo(); console.log(res); } getUser();上面代码运行控制台会报Uncaught (in promise) Error如果业务没有捕获在部分业务场景比如 Vue、React 项目中会直接导致组件逻辑异常。修复方案使用 try‑catch 捕获异常async function getUser() { try { const res await fetchUserInfo(); console.log(用户数据, res); } catch (err) { console.error(请求出错, err.message); // 做降级处理返回默认数据或者提示用户 } } getUser();补充小提示如果不想每一处都写 try‑catch也可以给 Promise 结尾加上.catch()做兜底。坑 2循环里面写 await误以为实现并发结果串行执行业务中经常会遍历数组发起接口请求很多同学直接在 for 循环里面写 await以为是并发请求实际变成串行请求一个完成才执行下一个数据量大的时候页面加载特别慢。错误写法async function batchRequest(idList) { for(const id of idList) { // 这里会串行执行一个请求结束才下一个 const res await fetchData(id); console.log(res); } } function fetchData(id) { return new Promise(resolve{ setTimeout(()resolve(数据${id}),1000) }) } batchRequest([1,2,3]);上面 3 个请求串行执行总耗时接近 3 秒。想要真正并发先用 map 生成 Promise 任务数组再用Promise.all统一等待。正确并发写法async function batchRequest(idList) { // 先启动所有异步任务 const promiseArr idList.map(id fetchData(id)); // 等待全部完成 const resultList await Promise.all(promiseArr); console.log(resultList); } batchRequest([1,2,3]);⚠️注意Promise.all 有个特性任意一个 Promise reject整体直接失败。如果希望部分失败不影响其他任务可以改用Promise.allSettled。坑 3混淆同步函数和 async 函数忘记返回 Promise很多新手会误以为只要函数里面写了 await函数就是异步。还有一个常见误区async 函数就算内部没有 await返回值也会自动包装成 Promise 对象。async function test() { return 100; } // 错误直接拿返回值拿到的是Promise对象不是100 const num test(); console.log(num); // Promise {fulfilled: 100} // 正确需要await或者.then()获取结果 async function run(){ const num await test(); console.log(num); } run(x3h.ulfvw.cN);经常看到业务代码把 async 函数的返回值直接拿来做判断得到 Promise 对象布尔判断永远为 true造成业务逻辑 bug。坑 4Promise.then 嵌套混用 async/await逻辑混乱有些老项目改造同时使用.then 链式调用又混用 await代码逻辑交织在一起时序变得很难看明白后期维护很折磨人。不推荐写法async function demo() { fetchUserInfo().then(res{ console.log(res) }) await fetchOtherData(); }这里 fetchUserInfo 没有 await不会阻塞会和后面的 await 并发执行很多人误以为会顺序执行。同一个业务逻辑尽量统一风格优先全部使用 async‑await。坑 5Promise.all 一个失败全部崩盘没有做容错上面简单提到 Promise.all这是开发中很容易踩的大坑。多个接口并发只要其中一个接口报错整个 Promise.all 直接 reject其他成功接口的数据全部拿不到。错误示例const p1 Promise.resolve(成功数据1); const p2 Promise.reject(new Error(接口2失败)); const p3 Promise.resolve(成功数据3); // p2报错整体直接失败p1、p3成功的数据拿不到 await Promise.all([p1,p2,p3]);业务场景如果希望部分接口失败不阻塞整体改用Promise.allSettled自己手动过滤成功和失败的结果async function safeBatch() { const p1 Promise.resolve(成功数据1); const p2 Promise.reject(new Error(接口2失败)); const p3 Promise.resolve(成功数据3); const results await Promise.allSettled([p1,p2,p3]); // 筛选成功的结果 const successData results .filter(itemitem.status fulfilled) .map(itemitem.value); console.log(成功的数据, successData); } safeBatch();开发中异步代码的小建议优先统一编码风格要么纯 then 链式要么统一 async/await不要大量混用异步请求一定要处理异常不要放任错误静默消失分清串行和并发循环里 await 默认串行并发使用 Promise.all/allSettled记住 async 函数永远返回 Promise不能直接获取返回值并发接口思考业务容错不是所有场景都适合 Promise.all。写在最后Promise 和 async/await 极大改善了 JS 异步的编码体验告别了回调地狱但语法糖掩盖了底层异步机制。很多坑不是语法本身的问题是我们对异步执行时序理解不到位。写异步代码的时候不要只看代码能不能跑通多思考任务是串行还是并发异常有没有兜底拿到的是原始数据还是 Promise 对象把这几点想清楚大部分异步 bug 都可以提前规避

相关新闻

前端面试官:Post为什么要发送两次请求?

前端面试官:Post为什么要发送两次请求?

💡 核心思路 浏览器出于安全考虑,对“非简单请求”自动发起 OPTIONS 预检以获取服务器授权,性能优化的本质是“将非简单请求降级为简单请求”或“缓存预检结果”。🏗️ 解决方案架构图(文本版) [客户端 Bro…

2026/8/23 18:21:20 阅读更多 →
医疗器械 UDI 与动力电池追溯:一物一码合规标签打印方案解析

医疗器械 UDI 与动力电池追溯:一物一码合规标签打印方案解析

引言一块动力电池从出厂到报废,可能要流转十几年;一支植入人体的医疗器械,直接关乎患者生命安全。这两类看似毫不相关的产品,如今被同一条规则串在了一起:每一件都必须有一个唯一的"身份证",并且…

2026/8/23 20:19:03 阅读更多 →
Ornith-1.5: From Self-Scaffolding to Self-Improvement——从自我脚手架搭建到自我改进

Ornith-1.5: From Self-Scaffolding to Self-Improvement——从自我脚手架搭建到自我改进

一、核心贡献Ornith-1.5 提出了一种端到端的自我改进框架,让大语言模型能够通过持续自我生成任务、构建解决方案脚手架、产出训练数据,形成一个闭环的自我提升系统。这是 Ornith-1.0 自我脚手架搭建框架的重大升级。二、技术核心:三阶段自我改…

2026/8/23 18:26:19 阅读更多 →

最新新闻

智能体预测新范式:自适应因子记忆如何让AI动态导航未来

智能体预测新范式:自适应因子记忆如何让AI动态导航未来

1. 项目概述:当智能体需要“预测未来”时,我们缺了什么? 在AI代理(Agent)技术日益成为自动化决策核心的今天,我们赋予它们的能力越来越复杂:从执行预设指令,到理解自然语言&#xff…

2026/8/23 20:18:33 阅读更多 →
JavaScript迭代器协议深度解析:从for...of到异步迭代与生成器实战

JavaScript迭代器协议深度解析:从for...of到异步迭代与生成器实战

1. 从“迭代”到“迭代器”:一个被误解的核心概念很多刚接触编程的朋友,一听到“迭代器”(Iterator),第一反应可能就是“哦,循环嘛”。我以前也这么想,直到在项目里踩了几个大坑才明白&#xff…

2026/8/23 20:18:33 阅读更多 →
大模型核心技术解析与AI求职实战指南

大模型核心技术解析与AI求职实战指南

1. 大模型时代的行业变革与机遇 2023年被称为"大模型元年",全球科技巨头和创业公司纷纷投入这场AI军备竞赛。根据斯坦福AI指数报告,大模型相关投资在过去一年增长了近300%,而头部企业的相关岗位薪资涨幅达到45%。这个领域正在经历从…

2026/8/23 20:18:33 阅读更多 →
让AI学会物理规律:视频世界模型的外推能力与实现方法

让AI学会物理规律:视频世界模型的外推能力与实现方法

最近在跟进计算机视觉领域的前沿研究时,发现一个很有意思的挑战:很多视频预测模型在训练集上表现惊艳,但一旦遇到训练时没见过的场景或物体运动,预测结果就变得“反物理”,比如物体凭空消失、穿透墙壁或者违反能量守恒…

2026/8/23 20:18:33 阅读更多 →
美赛论文算法总结:从逻辑构建到可视化呈现的实战指南

美赛论文算法总结:从逻辑构建到可视化呈现的实战指南

1. 从“交作业”到“拿奖”:美赛论文算法总结的核心价值每年一月底到二月初,全球数万支队伍都会经历一场为期四天四夜的“头脑风暴”——美国大学生数学建模竞赛。对于很多同学来说,美赛的挑战不仅在于解题,更在于如何将复杂的思路…

2026/8/23 20:18:33 阅读更多 →
蒙特卡罗模拟:从核心原理到数学建模实战

蒙特卡罗模拟:从核心原理到数学建模实战

1. 从“赌场”到“实验室”:蒙特卡罗模拟的起源与核心思想我第一次接触蒙特卡罗模拟,是在一个关于核反应堆中子扩散的经典案例里。当时我就在想,这么高大上的物理问题,怎么就用上了以赌城命名的数学方法?后来才明白&am…

2026/8/23 20:17:32 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →