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

不使用Promise解决Ajax异步加载3张图片顺序错乱问题

不使用Promise解决Ajax图片加载顺序问题

针对你需要加载3张连续全景切片但顺序无法保证的问题,有两种实用的非Promise方案:

方法1:串行回调链式调用

通过前一张加载完成后再发起下一张请求的方式,天然保证图片插入顺序,适合对加载顺序严格要求且不介意总耗时稍长的场景。

// 指定要加载的连续图片索引(示例为0、1、2)
const targetIndices = [0, 1, 2];
const container = document.getElementById('panorama-container');

// 封装单张图片加载函数,完成后调用回调
function loadSingleImage(index, nextCallback) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', `http://198.245.55.77/mars/camera.php?index=${index}`, true);
  xhr.responseType = 'blob'; // 以Blob形式接收图片数据

  xhr.onload = function() {
    if (xhr.status === 200) {
      const img = document.createElement('img');
      img.src = URL.createObjectURL(xhr.response);
      img.alt = `全景切片 ${index}`;
      container.appendChild(img); // 直接按请求顺序插入DOM
      nextCallback(); // 触发下一张图片的加载
    }
  };

  xhr.send();
}

// 链式执行加载流程
loadSingleImage(targetIndices[0], function() {
  loadSingleImage(targetIndices[1], function() {
    loadSingleImage(targetIndices[2], function() {
      console.log('3张全景切片加载完成');
    });
  });
});

方法2:并行请求+按顺序插入

同时发起所有请求,先将加载好的图片按索引暂存,等全部加载完成后按预设顺序插入DOM,这种方式总加载时间更短(接近单张图片的最长加载时间),效率更高。

const targetIndices = [0, 1, 2];
const container = document.getElementById('panorama-container');
const loadedImages = {}; // 按索引存储已加载的图片对象
let loadedCount = 0; // 记录已完成加载的图片数量

function loadSingleImage(index) {
  const xhr = new XMLHttpRequest();
  xhr.open('GET', `http://198.245.55.77/mars/camera.php?index=${index}`, true);
  xhr.responseType = 'blob';

  xhr.onload = function() {
    if (xhr.status === 200) {
      const img = document.createElement('img');
      img.src = URL.createObjectURL(xhr.response);
      img.alt = `全景切片 ${index}`;
      loadedImages[index] = img; // 暂存图片
      loadedCount++;

      // 所有图片加载完成后,按顺序插入
      if (loadedCount === targetIndices.length) {
        targetIndices.forEach(index => {
          container.appendChild(loadedImages[index]);
        });
        console.log('3张全景切片加载完成');
      }
    }
  };

  xhr.send();
}

// 并行发起所有请求
targetIndices.forEach(index => loadSingleImage(index));

两种方案对比

  • 串行回调:顺序绝对可靠,但总加载时间为三张图片加载时间之和,适合图片数量少的场景。
  • 并行暂存:加载效率更高,最终插入顺序可控,适合需要同时加载多张图片的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 01:38:34