【发布时间】:2022-02-14 00:24:19
【问题描述】:
我有这个函数,其中包含其他嵌套的异步函数。
我正在解压缩一个 zip 文件,然后将每个 HTMLImageElement 附加到一个数组中。
但是,数组是这样打印的
16 是我期望的正确数量的图像,但是当我console.log() 它们时它们是未定义的。
export async function fetchVisuals(TestID: number) {
var zip = new JSZip();
const res = await fetch('*DJANGO URL*', {
body: JSON.stringify(TestID),
method: 'POST'
})
let http_ok = res.ok
const blob = await res.blob()
var bufferPromise = await blob.arrayBuffer();
zip.loadAsync(bufferPromise).then(async ({files}) => {
const mediaFiles = Object.entries(files).filter(([fileName]) =>
fileName.endsWith('.jpg'),
);
if (!mediaFiles.length) {
throw new Error('No media files found in archive');
}
// I'm very confident the issue is to do with the below function
let promiseArray = mediaFiles.map(function([,image]) {
image.async('blob').then((blob: Blob | MediaSource) => {
console.log("mediaFiles loop")
const img = new Image();
img.src = URL.createObjectURL(blob)
console.log(img)
return img
})
})
Promise.all(promiseArray).then(function(resultsArray) {
console.log(resultsArray)
})
})
}
我将每个图像的承诺映射到一个数组,然后在这个数组上执行Promise.all(),所以我不确定为什么它仍然以undefined 的形式返回。
在mediaFiles.map()内部我做了一些打印,他们成功打印了img数据。
如何用HTMLImageElements 填充这个数组?
【问题讨论】:
-
你忘了
return image.async('blob')。 -
@EmielZuurbier 是的,就是这样。休息后我又读了一遍,意识到我回到了
image.async,就是这样......你的改变修复了它:) -
顺便说一句,使用
const {files} = await zip.loadAsync(bufferPromise);而不是.then(…),其他then调用相同。你也忘了return(或await)Promise.all(promiseArray)。
标签: javascript arrays reactjs asynchronous