You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用async函数加载多图仅最后一张生效,疑与全局变量相关

问题分析与解决

问题根源

你用了全局变量imgEl,每次调用createImage都会把这个变量替换成新创建的img元素。因为Promise.all是并行执行三个createImage,三个函数几乎同时运行,imgEl会被最后一次调用的img元素覆盖。前两个img的load事件触发时,执行append(imgEl)其实是在加最后那个img元素——而DOM里同一个元素只能存在一个位置,所以前两次append相当于把最后一张img从容器里移了两次,最终只留下最后一张。

修复方案

把imgEl的声明移到createImage函数内部,变成局部变量,让每个createImage调用都拥有独立的img元素,互不干扰。

修改后的代码:

const imageContainer = document.querySelector('.images');
function createImage(imgPath) {
  // 将imgEl改为函数内的局部变量
  const imgEl = document.createElement('img');
  return new Promise((resolve, reject) => {
    imgEl.src = imgPath;
    imgEl.addEventListener('load', () => {
      imageContainer.append(imgEl);
      resolve(imgEl);
    });
    imgEl.addEventListener('error', e => reject(e));
  });
}

async function loadAll(...imgPaths) {
  try {
    // 此处无需额外的async/await,createImage本身已返回Promise
    const res = await Promise.all(imgPaths.map(createImage));
    res.forEach(el => el.classList.add('paralell'));
  } catch (error) {
    console.log(error);
  }
}

loadAll('/img/img-1.jpg', '/img/img-2.jpg', '/img/img-3.jpg');

内容的提问来源于stack exchange,提问作者noharm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:20:20