讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在 JavaScript 循环中正确等待异步后端调用完成

陌强姑娘_6991

陌强姑娘_6991

发布时间:2026-07-23 22:32:29

|

303人浏览过

|

来源于php中文网

原创

如何在 JavaScript 循环中正确等待异步后端调用完成

本文详解如何在遍历数组时同步等待每个异步请求(如文件下载)完成,避免状态提前更新;核心方案是将 forEach 替换为 for...of 循环并配合 async/await,确保所有异步操作串行或并行执行完毕后再更新 React 状态。

本文详解如何在遍历数组时同步等待每个异步请求(如文件下载)完成,避免状态提前更新;核心方案是将 `foreach` 替换为 `for...of` 循环并配合 `async/await`,确保所有异步操作串行或并行执行完毕后再更新 react 状态。

在 JavaScript 中,尤其是从 Java 等同步语言转来的开发者,常误以为 forEach 支持 await ——但事实是:Array.prototype.forEach 无法暂停执行流,内部的 async 回调不会阻塞循环本身。你提供的原始代码中,setImprintInfo 总是在所有 downloadAttachment 发起后立即执行,而非等待它们完成,导致 imprint.attachment 字段未被赋值或为 undefined。

✅ 正确解法是使用原生 for...of 循环(支持 await),并确保 downloadAttachment 返回一个 Promise:

const setupImprintInfo = async (imprints: Imprint[]) => {
  for (const imprint of imprints) {
    if (imprint.shouldDownloadAttachment) {
      try {
        const blob = await downloadAttachment(imprint.id);
        imprint.attachment = blob;
      } catch (error) {
        console.error(`Failed to download attachment for imprint ${imprint.id}:`, error);
        // 可选:保留 imprint 原状,或设置 error flag 供 UI 提示
        imprint.attachment = null;
      }
    }
  }
  setImprintInfo({ imprints });
};

⚠️ 注意事项:

React Best Practices 2 0.1.0
React Best Practices 2 0.1.0

React 与 Next.js 性能优化指南,源自 Vercel 工程团队。适用于编写、审查或重构 React/Next.js 代码时使用。

下载
  • downloadAttachment(id) 必须返回 Promise(如基于 fetch 或 axios 的封装函数),否则 await 无意义;
  • 若需并行下载(提升性能,适用于独立文件),可改用 Promise.all + map:
    const downloadTasks = imprints
      .filter(imprint => imprint.shouldDownloadAttachment)
      .map(async imprint => ({
        ...imprint,
        attachment: await downloadAttachment(imprint.id)
      }));
    const updatedImprints = await Promise.all(downloadTasks);
    // 注意:需合并结果回原数组结构,或重构数据流
  • 不建议在 forEach 中 await ——即使语法不报错,也不会阻塞循环,等效于 .then() 链式调用,仍存在竞态风险;
  • 若 imprints 是 React state 的直接引用,修改其属性(如 imprint.attachment = blob)属于可变操作,虽在当前场景可行,但更推荐函数式更新(如 map 生成新数组)以契合 React 最佳实践。

总结:async/await 的执行控制权只存在于 for...of、for、while 等原生循环中;拥抱 Promise 组合工具(Promise.all、Promise.allSettled)并明确区分串行/并行需求,是处理批量异步任务的关键。

立即学习“Java免费学习笔记(深入)”;

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2203

2023.08.11

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

5830

2024.03.19

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

5126

2024.03.19

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

4366

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

1109

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

4284

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

880

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

1756

2023.09.04

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn