React 中 map 处理异步数据不渲染的问题及解决方法
作者:孩子 你要相信光
文章讲述了在使用React时遇到的异步问题导致页面卡顿的情况,通过Promise.all等方法解决了异步操作的顺序问题,使得页面能够正常渲染,感兴趣的朋友跟随小编一起看看吧
Map 异步之困:从卡顿到流畅的蜕变
当
map遇上异步,你的页面还在“思考人生”吗?
故事:一个让页面“沉默”的 bug
昨天,我的页面像个哑巴一样——数据准备好了,UI 却一片空白。控制台没有报错,网络请求一切正常,但用户看到的就是 “无”。
调试三小时后,终于找到了罪魁祸首:
// 🚨 沉默的“凶手”
const markList = data.map(item => ({
...item,
content: parseMarkdown(item.rawContent) // 这里返回的是 Promise!
}));
// 结果:markList = [Promise, Promise, Promise...]
// React: “我该渲染什么?一堆 Promise 对象?”问题诊断:为什么页面不渲染?
同步思维 vs 异步现实
// ❌ 我们以为的(同步思维): const result = [处理后的对象1, 处理后的对象2, ...] // ⚡ 实际上的(异步现实): const result = [Promise<pending>, Promise<pending>, ...]
React 的困惑
// React 尝试渲染时:
<div>
{markList.map(item => (
<div>{item.content}</div> // item.content 是 Promise,不是字符串!
))}
</div>
// 输出:[object Promise], [object Promise]...解决方案:让异步“排队站好”
方案一:Promise.all 大法(最常用)
// ✅ 正确姿势:等待所有 Promise 完成
const processedData = await Promise.all(
data.map(async item => ({
...item,
content: await parseMarkdown(item.rawContent)
}))
);可视化流程:
原始数据:[A, B, C]
↓ map + async(创建 Promise 队列)
Promise队列:[PA, PB, PC]
↓ Promise.all(等待全部完成)
处理结果:[A', B', C'] ← 这才是 React 要的!有趣的比喻
把异步处理想象成餐厅厨房:
// ❌ 错误做法:一个厨师做完所有菜才上菜 // (顾客:我饿死了...) // ✅ 正确做法:Promise.all - 多个厨师并行做菜 // (所有菜同时做好,一起上桌) // 🎯 优化做法:分批处理 - 做好一部分先上 // (顾客:先吃着,后面的马上好)
备忘清单
需要 Promise.all 的场景:
- ✅
marked.parse()处理 Markdown - ✅ 图片预加载
new Image().src - ✅ API 并行请求多个资源
- ✅ 文件读取/处理
- ✅ 加密/解密操作
不需要 Promise.all 的场景:
- ❌ 纯同步计算(
array.map(x => x * 2)) - ❌ 简单的数据转换
- ❌ 过滤/排序操作
下次当你的页面陷入沉默时,记得问一句:
“是不是有 Promise 在 map 里没被 await?”
记住:异步不可怕,可怕的是不知道它是异步的!
到此这篇关于React 中 map 处理异步数据不渲染的问题及解决方法的文章就介绍到这了,更多相关react map 处理异步数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
