【问题标题】:Async Javascript Promise to set src of img异步 Javascript Promise 设置 img 的 src
【发布时间】:2021-09-15 14:04:49
【问题描述】:

编辑:我还在用这个头撞我的桌子。

我正在尝试为画廊中的一堆 img 标签动态设置 src,并使用 javascript。每张画廊幻灯片都有 img 标签,我将它们分为两类, “之前和之后”。问题是有些页面有全部 8 张照片,而其他页面则更少。如果图像加载成功(*在这种情况下,让我们将成功定义为响应不是 404 未找到),一个 .loaded 类被添加到 img 中,这给它一个边框,但如果有一个 404 未找到,然后一个 .loaded 类。添加了隐藏类,将 display: hidden 设置为 img。

当前问题:尽管某些 img 标签在控制台中生成以下错误消息“GET http://blablabla/Images/gallery/job1/before-1.jpg 404 (Not Found)”,. onerror 不会触发, .onload 会触发。如果我检查尚未加载的 img 标签(顺便说一句,它们已经在页面上),我可以看到它们具有已填写的 src 属性,尽管提供的路径中的图像不存在。当然它仍然应该是一个错误?

const loadImg = function (img, url) {
    return new Promise((myResolve, myReject) => {
      img.src = url;
      img.onload = myResolve(img);
      img.onerror = myReject(img);
    });
  };

  const populateBeforeImgs = function () {
    for (let i = 0; i < beforeImgs.length; i++) {
      const img = beforeImgs[i];
      const url = `Images/gallery/job${galleryIndex}/before-${i + 1}.jpg`;
      loadImg(img, url)
        .then((value) => {
          value.classList.add("loaded");
        })
        .catch((error) => {
          error.classList.add("hidden");
        });
    }
  };

  const populateAfterImgs = function () {
    for (let i = 0; i < afterImgs.length; i++) {
      const img = afterImgs[i];
      const url = `Images/gallery/job${galleryIndex}/after-${i + 1}.jpg`;
      loadImg(img, url)
        .then((value) => {
          value.classList.add("loaded");
        })
        .catch((error) => {
          error.classList.add("hidden");
        });
    }
  };

【问题讨论】:

  • Response.ok 是什么?它来自哪里?
  • 这只是我在阅读另一篇与我的问题有点相似但与我的代码无关的帖子后尝试的东西。恐怕只是我在不理解的情况下尝试了一些事情
  • 你的loadImg 函数看起来很不完整——它总是立即调用myResolve(img),从不真正等待什么。也许你的意思是img.onload = myResolve; img.onerror = myReject;
  • @Bergi 感谢您的建议!我已经尝试了您的建议,但未加载的 img 标签仍然得到解决,而不是去捕获。
  • @NekiMakiHaida 我看到您已将代码更改为 img.onload = myResolve(img);。这不是我或泰赛尔所写的。

标签: javascript asynchronous promise


【解决方案1】:

问题在于你的loadImg 函数:

if (Response.ok) {       

Response 是在 window 上定义的,但 Response.ok 是未定义的。未定义的计算结果为假(是一个假值)

试试这个:

const loadImg = function(img, url) {
  return new Promise((resolve, reject) => {
    img.src = url;
    img.onload = () => resolve(img);
    img.onerror = () => reject(img);
  });
};

const img1 = new Image();
const img2 = new Image();

loadImg(img1, "https://www.placecage.com/c/200/300").then((img) => console.log("image 1 loaded!")).catch(() => console.warn("img 1 failed to load"));
loadImg(img2, "https://ihopethisisnotavalidurladasdasd").then((img) => console.log("image 2 loaded!")).catch(() => console.warn("img 2 failed to load"))

【讨论】:

  • 您好,感谢您的回复。我按照你的建议做了,现在一切都通过了,即使“加载资源失败:服务器响应状态为 404(未找到)”出现在控制台中。一切都只是传递给 myResolve。
  • 请查看我的示例。如果你不能让它工作,请用新代码和新问题更新你的问题。您应该使用catch() 检查错误,而不是作为.then() 的第二个参数
  • 感谢所有帮助。这完成了工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2011-12-14
  • 2023-03-03
  • 2017-12-13
  • 1970-01-01
  • 2016-08-03
  • 2018-01-14
相关资源
最近更新 更多