当前位置: 首页 > news >正文

为什么 await 没生效?

Array.prototype.map() 的异步陷阱:为什么 await 没生效?
map 里的异步函数,返回的是 Promise 数组,不是结果数组。忘了 Promise.all,代码直接跑飞。
事故现场
JavaScript
// 期望:依次获取 3 个用户详情
const userIds = [1, 2, 3];
const users = userIds.map(async id => {
return await fetchUser(id);
});

console.log(users); // [Promise, Promise, Promise] ❌ 不是用户数据!
后续操作直接报错:
JavaScript
users.forEach(u => console.log(u.name));
// undefined undefined undefined
原因:map 不会等待异步完成
JavaScript
// map 的回调返回什么,结果就是什么
[1, 2, 3].map(x => x * 2); // [2, 4, 6] ✅ 同步
[1, 2, 3].map(async x => x * 2); // [Promise, Promise, Promise] ⚠️ 异步
async 函数隐式返回 Promise,map 原封不动收集这些 Promise。
正确写法
方案 1:Promise.all 解包(推荐)
JavaScript
const userIds = [1, 2, 3];
const users = await Promise.all(
userIds.map(id => fetchUser(id))
);
console.log(users); // [{...}, {...}, {...}] ✅
方案 2:for...of 顺序执行(需要控制并发)
JavaScript

const users = [];
for (const id of userIds) {
const user = await fetchUser(id); // 依次执行,非并发
users.push(user);
}
方案 3:forEach 的坑(别用)
JavaScript
// ❌ 错误:forEach 不会等待异步完成
userIds.forEach(async id => {
const user = await fetchUser(id);
console.log(user); // 循环结束后才执行,顺序混乱
});
进阶:带错误处理的批量请求
JavaScript
const results = await Promise.allSettled(
userIds.map(id => fetchUser(id))
);

const users = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);
一句话总结
map + async = Promise 数组,想拿结果包一层 Promise.all。异步循环用 for...of,别用 forEach。
异步是传染病,一个函数 async,调用链全得 await。

http://www.jsqmd.com/news/657197/

相关文章:

  • 免费解锁Cursor AI Pro完整功能:5分钟掌握专业级AI编程助手
  • 可跑在STM32上的EtherCAT主机协议栈
  • 告别编译地狱!用Python的TenSEAL库5分钟上手同态加密实战(CKKS方案)
  • Electron 摄像头打不开/锁死问题排查手册
  • WebDebugx移动端网页调试实用技巧大全
  • 深入解析基4 Booth算法在定点乘法器中的高效实现
  • 告别手动复制粘贴:用Makefile自动化你的Vivado DPU XO文件生成流程
  • 【智能代码生成×DevOps流水线实战指南】:20年SRE亲授5大高危集成陷阱与零故障落地路径
  • 企业级仓库管理实战:若依WMS现代化仓储解决方案深度解析
  • MicMac终极指南:免费开源摄影测量软件从入门到精通
  • 03华夏之光永存:黄大年茶思屋榜文解法「第6期第3题」异构算力协同的HPC+AI实时训练算法
  • 从‘硬’到‘软’:一个老电源工程师的软启动电路设计笔记(基于光耦与比较器的经典实现)
  • 图像压缩ONNX模型跨平台推理一致性问题解决方案
  • 告别HAL库和寄存器:用Arduino语法在Keil5里玩转STM32F103(附完整移植流程)
  • UE4/UE5 Runtime FBX导入:从零到一构建高效动态模型加载方案
  • Nuke Survival Toolkit:150+专业插件如何彻底改变你的视觉特效工作流程
  • 嵌入式Linux驱动开发
  • PyTorch Transformer从入门到实战:手把手教你搭建中英翻译系统(附完整代码)
  • 微信小程序消息订阅踩坑实录:uni-app中withSubscriptions参数的那些‘坑’与最佳实践
  • 高效稳定的西门子200PLC和显控触摸屏编写的智能污水处理控制系统,实测一年运行稳定,无人值守可靠
  • 别再傻傻分不清了!一文搞懂LiDAR测距的三种主流方案:ToF脉冲、ToF相位与三角法
  • 终极指南:3步将任何网页转换为可编辑的Figma设计稿
  • C语言struct使用避坑指南:从‘declaration does not declare anything‘报错说起
  • STM32点蜂鸣器
  • Winhance中文版:让Windows系统管理变得简单直观
  • 【解决方案】VMware Fusion 虚拟机突然无法启动解决方案(Ubuntu 内核更新 VMware 未适配)
  • 拆解ERP批次库存管理逻辑:多仓库调拨与效期预警难题,这套saas平台功能设计如何落地
  • 基于图神经网络的智能合约漏洞检测
  • 国密算法-密钥对创建
  • 【姿态估计】遗传算法GA和灰狼算法GWO优化运动捕捉数据的三维人体姿态估计【含Matlab源码 15343期】