Javascript - не может перебирать массив объектов с изображениями - PullRequest
0 голосов
/ 05 декабря 2018

У меня трудности с итерацией массива объектов, который содержит изображение.Как показывает мой код, массив в консоли выглядит пустым, но когда я открываю его в консоли, я вижу все эти объекты также с номерами итераций.Я не могу Google и добраться до точки, как преобразовать его в правильный рабочий массив, чтобы сделать в цикле и перебрать его в Vue.js.Я прилагаю вам код, где комментарии говорят больше, чем мое описание.

        const frameImage = [
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/lukamodric_165.png'
        },
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/florentinoperez_11.jpg'
        },
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/ramosbarkinsta1.jpg'
        },
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/lukamodric_165.png'
        },
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/florentinoperez_11.jpg'
        },
        {
            url: 'http://www.realmadryt.pl/fotki/_up/newsy/ramosbarkinsta1.jpg'
        },
    ];

    let createdImages = [];

    frameImage.forEach(item => {
        const image = new Image();
        image.src = item.url;
        image.onload = () => {
            // set image only when it is loaded
            createdImages.push({
                image,
                width: image.width,
                height: image.height,
                x: 0,
                y: 0,
                draggable: true
            });
        };
    });
    console.log(createdImages)


    // nothing happens
    createdImages.forEach(item => {
        console.log(item)
    });

    //also nothing happens
    for(img in createdImages) {
        console.log(img);
    }

    //length is actually 0?
    console.log(createdImages.length)

Также jsFiddle: LINK

1 Ответ

0 голосов
/ 05 декабря 2018

Я бы сопоставил массив URL-адресов с массивом обещаний, которые разрешаются вашим объектом при загрузке изображения.Затем используйте Promise.all, чтобы дождаться их загрузки (разрешения).Например

Promise.all(frameImage.map(({ url }) => new Promise((resolve, reject) => {
  const image = new Image()
  image.onload = () => resolve({
    image,
    width: image.width,
    height: image.height,
    x: 0,
    y: 0,
    draggable: true
  })
  image.onerror = reject
  image.src = src
}))).then(createdImages => {
  // now you can iterate
}).catch(err => {
  console.error('Could not load all images', err)
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...