【问题标题】:Show image using setTimeout and for loop in array在数组中使用 setTimeout 和 for 循环显示图像
【发布时间】:2020-07-10 07:21:39
【问题描述】:
images: [
    {
        img: 'car_0.png',
        time: 3000,
    },
    {
        img: 'car_1.png',
        time: 500,
    },
    {
        img: 'car_2.png',
        time: 500,
    },
    {
        img: 'car_3.png',
        time: 1000,
    },
],

我需要在我的页面中显示图像。 time 是图像应该显示在页面上的时间。例如:

第一张照片 car_0.png 在页面上显示 3 秒。 3 秒后变为第二张图片,显示 0.5 秒...

这个方法我写过但是不行:

if(images !== undefined) {
    for(let i = 0; i < images.length; i++) {
        setTimeout(() => {
            this.images = images[i].img
        }, images[i].time + images[i + 1].time)
    }
}

编辑:

我将方法更改为:

if(images !== undefined) {
    let time
    for(let i = 0; i < images.length; i++) {
        if(i > 0) {
            time = time + images[i].time
        }
        else {
            time = images[i].time
        }
        console.log(time)
        setTimeout(() => {
            this.images = images[i].img
        }, time)
    }
}

现在在console.log(time)我有价值:

3000
3500
4000
5000

但还是不能正常工作,第一张图片应该立即出现并显示3秒。现在会在 3 秒后出现

【问题讨论】:

  • images[i + 1].time 将在最后一次迭代中打破循环
  • 您希望将所有先前“图像”的总和 + 当前一个作为超时,而不是当前一个 + 下一个。
  • 您需要img 元素来显示图像,然后更改该元素的src 属性,而不是使用未定义的images 数组成员。

标签: javascript for-loop settimeout


【解决方案1】:

在 html 中添加 img 元素并使用 javascript 更改其 src 属性。

要按顺序显示图像,您可以使用生成器函数。

  1. 创建一个生成器函数,在特定时间后生成一个图像对象。

  2. 创建另一个调用此生成器函数以获取图像对象的函数,从返回的图像对象中获取img 属性的值,并将其设置为img 元素上src 属性的值。

    此函数还会创建一个超时,该超时在等于当前图像对象的time 属性的时间之后到期。当超时到期时,该函数再次调用自身以从生成器函数中获取下一张图像并显示该图像。

    重复这些步骤,直到没有更多图像可显示。

const images = [
    { img: 'https://picsum.photos/id/0/100', time: 3000 },
    { img: 'https://picsum.photos/id/1/100', time: 500 },
    { img: 'https://picsum.photos/id/10/100', time: 500 },
    { img: 'https://picsum.photos/id/100/100', time: 1000 }
];

const img = document.querySelector('img');

function* getImage() {
  for (let image of images) {
    yield image;
  }
}

const imageGenerator = getImage();

function showNextImage() {
  const image = imageGenerator.next().value;

  if (!image) return;
  
  img.src = image.img;
  
  setTimeout(showNextImage, image.time);
};

showNextImage();
&lt;img src=""/&gt;

或者,您可以使用一个变量来跟踪当前显示的图像的索引以及使用此索引变量访问的每个图像对象,而不是使用生成器函数来获取图像对象。

const images = [
    { img: 'https://picsum.photos/id/0/100', time: 3000 },
    { img: 'https://picsum.photos/id/1/100', time: 500 },
    { img: 'https://picsum.photos/id/10/100', time: 500 },
    { img: 'https://picsum.photos/id/100/100', time: 1000 }
];

const img = document.querySelector('img');
let index = 0;

function showNextImage() {
  const image = images[index++];

  if (!image) return;
  
  img.src = image.img;
  setTimeout(showNextImage, image.time);
};

showNextImage();
&lt;img src=""/&gt;

【讨论】:

    【解决方案2】:

    请看下面的代码,它对我有用:

    var images = [
            {
                img: 'car_0.png',
                time: 3000,
            },
            {
                img: 'car_1.png',
                time: 500,
            },
            {
                img: 'car_2.png',
                time: 500,
            },
            {
                img: 'car_3.png',
                time: 1000,
            },
        ]
        var currentImage = 0;
        function showImages(){
            
            let img = images[currentImage];
            console.log(img.img);
            setTimeout(function () {
                currentImage++;
                if(currentImage<images.length){
                  showImages();
                }
            }, img.time);
        };
        showImages();

    【讨论】:

      【解决方案3】:

      第一:
      将第一行的 : 更改为 =,
      将最后一个 , 替换为 ;,
      并从数组中最后一个对象之后删除,

      其次,试试这个代码:

      function displayImage(images, i=0) {
        if(images.length==0) return;
        console.log(images[i].img); // replace with whatever you want to do
        i++;
        if(i==images.length) i=0;
        setTimeout(displayImage,images[i].time,images,i);
      }
      

      致电:

      displayImage(images);
      

      或:

      displayImage(images, 2); // if you want to start with the 3rd
      

      【讨论】:

        【解决方案4】:

        使用 promise 函数做这样的事情:

        const images = [{
            img: 'https://picsum.photos/id/0/100',
            time: 3000,
          },
          {
            img: 'https://picsum.photos/id/10/100',
            time: 500,
          },
          {
            img: 'https://picsum.photos/id/100/100',
            time: 500,
          },
          {
            img: 'https://picsum.photos/id/1000/100',
            time: 1000,
          },
        ];
        
        const waitNext = ({
          time
        }) => {
          return new Promise(function(resolve) {
            setTimeout(resolve, time);
          });
        }
        
        
        
        async function displayImages(images) {
          for (const image of images) {
            document.getElementById('img').src = image.img;
            await waitNext(image);
          }
        }
        
        displayImages(images)
        &lt;img id="img" src="" /&gt;

        【讨论】:

        • "第一张照片 car_0.png 在页面上显示 3 秒。3 秒后变为第二张图片,显示 0.5 秒..."
        • 您的编辑没有解决我第一条评论的要求。
        • @Andreas idk 我一开始没明白这是另一个更新
        • “显示”图像的部分在哪里?
        • @G.aziz OP 希望立即显示第一张图片。 Here's the fixed version of your code
        猜你喜欢
        • 1970-01-01
        • 2021-07-09
        • 2011-12-07
        • 2020-08-23
        • 2021-12-27
        • 2019-10-08
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        相关资源
        最近更新 更多