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

图片加载中使用Callback实现顺序执行失败,寻求技术协助

解决回调控制异步代码执行顺序的问题

嘿,我来帮你搞定这个顺序问题!你遇到的核心问题是图片加载是异步操作,浏览器不会等着图片加载完再继续执行后面的代码,这才导致了输出顺序和预期不符。

咱们先拆解下原代码的执行流程:

  • 调用processImage,先打印Start
  • 执行callback(loadImage),进入loadImage打印Load Method
  • 设置img.src后,浏览器后台开始加载图片,主线程直接跳出loadImage回到processImage
  • 立刻打印Finish
  • 等图片加载完成后,才触发img.onload打印Image Loaded

要实现你期望的顺序,得让processImage知道图片什么时候加载完成,然后再执行Finish。我们可以给loadImage加一个完成回调,在图片加载完成后通知processImage:

function processImage(callback) { 
  console.log("Start"); 
  // 给loadImage传入第二个参数:图片加载完成后要执行的回调
  callback('http://lorempixel.com/400/200/', function() {
    console.log("Finish");
  }); 
}

function loadImage(url, onComplete) { 
  console.log('Load Method');
  var img = new Image(); 
  img.src = url; 
  img.onload = function (event) { 
    console.log('Image Loaded');
    // 图片加载完成后,调用传入的完成回调
    onComplete();
  } 
}

processImage(loadImage);

现在执行顺序就完全符合你的预期了:

  1. Start
  2. Load Method
  3. 后台加载图片,直到完成后打印Image Loaded
  4. 触发onComplete回调,打印Finish

如果之后你想让代码更易读,还可以用Promise或者async/await来替代嵌套回调,不过用回调解决这个问题是最基础且直接的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:57:36