我有一个名为“ data”的全局变量,该变量在forEach循环内被修改。但是,由于循环是异步的,因此代码不会等到填充数据后再继续执行代码。这是使用JSZip库。
let data = [];
await zip.folder("folderName").forEach(async function (relativePath, file) {
let json = await zip.file(file.name).async("text");
data.push(json);
console.log(data.length); // prints increasing numbers
});
console.log(data.length); //prints 0
// need to do something with data but it is empty
在继续执行代码之前,如何等待数据数组填充?
答案 0 :(得分:0)
我阅读了JSZip文档,没有找到任何将forEach(callback)
转换为Promise
数组的方法。因此,我想到的唯一方法是获取文件数量并使用计数器。
const myFolder = zip.folder("folderName");
const numberOfCallbacks = Object.keys(myFolder.files).length - 1;
let counter = 0;
myFolder.forEach((relativePath, file) => {
// your code. you'd better create a Promise here and add it to an array of promises.
counter++;
if (counter === numberOfCallbacks) {
// everything is done. If you created Promise above, here you can use Promise.all()
}
});
我测试了上面的代码,它起作用了。让我知道是否有问题。
答案 1 :(得分:0)
forEach()
没有返回值,因此无法等待。您必须使用ZipObject#async()
填充每个await
和Promise.all()
的诺言数组,以获得结果:
const promises = [];
zip.folder("folderName").forEach(function (relativePath, file) {
promises.push(zip.file(file.name).async("text"));
});
Promise.all(promises).then(function (data) {
// do something with data
});