gpt4 book ai didi

javascript - promise 不在 thenable 中提供更新的数组

转载 作者:行者123 更新时间:2023-12-02 21:21:48 25 4
gpt4 key购买 nike

有一个数组,其中包含一些图像网址。

const imgs = [{
src:'./canvas-img1.jpg',
pos: 20
}, {
src: './canvas-img2.jpeg',
pos: 25
}]

我试图在我的应用程序中加载这些图像一次,然后将它们存储为缓存以供将来使用,这样我就不必一次又一次地加载它们。我正在使用这些图像将它们绘制在 Canvas 上。我正在执行以下步骤。

  1. 我发起一个 Promise 来加载所有图像。 Promise 加载图像并将它们存储到数组中。
  2. 一旦 promise 得到解决,我就把它们画在 Canvas 上

这是我的代码

drawCanvas(){
let canvas = document.getElementById("timeline-canvas")
let canvas_container = document.getElementById("canvas-container")
let ctx = canvas.getContext("2d")


this.loadImage().then((can_imgs)=>{
console.log(can_imgs.length) // this is coming as array of length 0
this.state.can_imgs.map((item, i)=>{
let x = (item.pos * window.innerWidth)/100
ctx.drawImage(item.img, x,0, 100, 100);
})
})
ctx.save()
}

//load images only once and cache them
loadImage = () => {
return new Promise(resolve => {
imgs.map((item, i)=>{
let img1 = new Image()
img1.src = item.src
let x = (item.pos * window.innerWidth)/100
img1.onload = function (e)
{
can_imgs.push({img: img1, pos: item.pos})
}
})
this.setState({can_imgs: can_imgs}, ()=>{
resolve(can_imgs)
})

})

}

但是当我在“then”中控制台“can_imgs.length”时,它控制台为零。它应该是长度为 2 的数组。我做错了什么?

最佳答案

您的 then 在图像实际加载之前被调用 - 因此在 img.onload 被触发之前。

要解决您的问题,请将每个单独的图像包装在一个 promise 中,并在最终解决 loadImage promise 之前等待所有图像:


loadImage = () => {
return new Promise(resolve => {

let images = imgs.map((item, i)=> new Promise((resolve) => {
let img1 = new Image()
img1.src = item.src
let x = (item.pos * window.innerWidth)/100
img1.onload = function (e)
{
can_imgs.push({img: img1, pos: item.pos})
resolve()
}
}))

// wait for all images to resolve
Promise.all(images).then(() => {
this.setState({can_imgs: can_imgs}, ()=>{
resolve(can_imgs)
})
})



})

}

关于javascript - promise 不在 thenable 中提供更新的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60827053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com