edited to remove a part of the question that was a duplicate

我有一个页面,加载到一个 gallery 的一堆图像,然后通过香草JS很好地重新排列它们.

为此,脚本必须等到所有图像都已加载(或超时).更改页面设置(就像用户设置过滤器一样)会导致AJAX脚本重新加载或添加图像.它们被作为预渲染的HTML页面发送.在这种情况下,当脚本立即运行时,图像尚未完全加载,从而丢失了脚本的关键信息,如宽度和高度.所以我需要等待,直到我得到这个信息(=所有图像都已完全加载).

这就是我的方法背后的 idea :我try 通过类名获取DOM这一部分中的所有图像, for each 图像添加一个promise ,以解决图像是否完全存在或短时间超时结束的问题.我想将所有这些promise 添加到一个数组中,然后使用Promise.All()判断该array.这解决了应该调用脚本来重新排列图片.

我以前从来没有直接与promise 合作过,我对JS也有些新手.

这就是我所拥有的:

function articleImageLoadingStatusChecker() {
    const articleImages = Array.from(document.getElementsByClassName("articleimage"));
    var listOfPromises = [];

    articleImages.forEach(image => function(image) {
        listOfPromises.push(
            new  Promise(resolve => {
                image.addEventListener('load', () => { resolve(true); });
            }));
    });
    return listOfPromises;
}

Promise.all(articleImageLoadingStatusChecker()).then(adjustImagesForGalleryView());

以下是我的问题:

  1. 我不确定我是否正确地实现了promise ,因此它实际上可以由Promise.all()进行判断.

  2. 我认为addEventListener(‘Load’,..)可能具有误导性,实际上不是要请求的正确状态.调用图库脚本时,图像可能已缓存或已加载,因此可能不会调用监听程序.我宁愿有一些,解决在任何情况下的promise ,如果图像是完全加载.此外,我目前没有线索如何添加一些东西,以解决1秒后的promise ,以防图像无法加载.

目前,这根本不起作用,我也没有 idea 了. 我们非常欢迎您的任何建议.谢谢.

推荐答案

document.getElementsByClassName()返回一个类似HTMLCollection数组的对象,该对象没有forEach方法.

要解决此问题,您可以使用Array.from()函数或spread syntax ...HTMLCollection转换为Array.

在这里,Array.map()是一个很好的加法,可以循环articleImages数组并 for each 图像元素返回Promise.我建议您解析图像元素本身.这样,您就可以稍后在promise 链中使用这些元素.

要在1秒后promise resolve,请在事件侦听器之前添加两个超时.在事件侦听器中,清除超时以防止在第一个load事件时运行超时回调.

在promise 链中,只引用adjustImagesForGalleryView,不要调用它(go 掉()).

function articleImageLoadingStatusChecker() {
  const articleImages = Array.from(document.getElementsByClassName("articleimage"));

  return articleImages.map(image => 
    new Promise(resolve => {
      let timeout = setTimeout(() => {
        resolve(image);
      }, 1000);

      image.addEventListener('load', () => {
        clearTimeout(timeout);
        resolve(image);
      });
    })
  );
}

Promise
  .all(articleImageLoadingStatusChecker())
  .then(adjustImagesForGalleryView);

Javascript相关问答推荐

将下拉分区与工具提示结合起来

如何从defineExpose访问数据和方法

访客柜台的风格React.js

在具有焦点和上下文的d3多线图表中,如何将上下文的刷新限制在特定日期?

如何在JavaScript中通过一次单击即可举办多个活动

脚本.js:3:20未捕获的类型错误:无法读取空的属性(读取addEventHandler)

创建1:1比例元素,以另一个元素为中心

在JavaScript中,是否有一种方法可以创建自定义thable,在等待某些代码后自动触发它?

vscode扩展-webView Panel按钮不起任何作用

Next.js(react)使用moment或不使用日期和时间格式

将现场录音发送到后端

在grafana情节,避免冲突的情节和传说

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

环境值在.js文件/Next.js中不起作用

JavaScript是否有多个`unfined`?

当代码另有说明时,随机放置的圆圈有时会从画布上消失

使每个<;li>;元素的 colored颜色 与随机生成的 colored颜色 列表不同(不重复

是否可以将异步调用与useState(UnctionName)一起使用

不协调嵌入图片

react 路由DOM有条件地呈现元素