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

Angular中使用TypeScript通过图片URL获取宽高的问题

问题根因
  • img.onload属于异步回调事件,仅在图片资源完全加载完成后才会触发执行。当前代码的return语句是同步执行逻辑,触发时onload回调还未运行,width和height未被赋值,因此返回undefinedxundefined。
  • 另外当前代码没有绑定onerror事件,图片加载失败时无异常捕获逻辑,也没有处理缓存场景下的触发顺序问题。
解决方案

通过Promise封装图片加载的异步逻辑,改造后的方法返回Promise实例,调用方通过异步方式获取尺寸结果。

改造后的方法代码

getImageSize(image: string): Promise<string> {
  return new Promise((resolve, reject) => {
    const img = new Image();
    // 先绑定事件再赋值src,避免缓存图片触发onload时还未绑定回调的问题
    img.onload = (event) => {
      const targetImg = event.currentTarget as HTMLImageElement;
      resolve(`${targetImg.width}x${targetImg.height}`);
    };
    img.onerror = (error) => {
      reject(`图片加载失败: ${error?.toString() || '未知错误'}`);
    };
    img.src = image;
  });
}

调用方法

方式1:async/await(推荐)

// 调用的函数需添加async修饰符
async getSizeDemo() {
  try {
    const imageSize = await this.getImageSize('替换为你的图片URL');
    console.log(imageSize); // 此处可拿到正确的尺寸拼接结果
  } catch (err) {
    console.error(err);
  }
}

方式2:then回调

getSizeDemo() {
  this.getImageSize('替换为你的图片URL')
    .then(imageSize => {
      console.log(imageSize); // 此处可拿到正确的尺寸拼接结果
    })
    .catch(err => {
      console.error(err);
    });
}

注意:所有需要用到图片尺寸的业务逻辑,必须放在await后的代码块、或者then回调中执行,不能同步获取结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:03