【问题标题】:Javascript - can't iterate through array of objects with imagesJavascript - 无法遍历带有图像的对象数组
【发布时间】:2019-05-06 11:17:23
【问题描述】:

我在遍历包含图像的对象数组时遇到了困难。正如我下面的代码显示控制台中的数组看起来有点空但是当我在控制台中打开它时,我看到所有这些对象也带有迭代编号。我无法通过谷歌搜索并指出如何将其转换为正确的工作数组以进行 for in 循环并在 Vue.js 中迭代它。 我附上 cmets 比我的描述更多的代码。

        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

【问题讨论】:

  • 什么都没有发生,因为您在onload 触发并填充它之前循环了createdImages
  • 哦,没想到是异步操作。谢谢!

标签: javascript arrays image-processing vue.js


【解决方案1】:

我会将 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)
})

【讨论】:

  • 不幸的是,我仍然无法从我的方法返回这些 createdImages。在一个 nuthsell createdImages 应该从包装这个 Promise 的外部方法返回,我该如何实现呢?我知道我必须从 .then() 回调函数中执行此操作,但我不知道如何
  • 哦,我忘了说我正在使用 Vue.js,这个方法在“eventBus”状态下是全局的,在我的组件上,我使用计算属性来使用 v-for 渲染这些图像。也许您知道实现这一目标的更好方法。
  • 是的,使用 Vuex。这种事情非常适合放入异步action。见Returning Promises from Vuex actions
  • 谢谢,但它不是那么大的项目,现在我通过观察计算属性来实现我想要的,当全局图像状态发生变化时会触发,然后我将转换后的状态推送到组件自己的 imageArr 中,是不是很糟糕?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
相关资源
最近更新 更多