在运行下一个代码之前,如何等待异步JSZip .forEach()调用完成?

时间:2019-01-20 08:18:21

标签: javascript typescript jszip

我有一个名为“ 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

在继续执行代码之前,如何等待数据数组填充?

2 个答案:

答案 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()填充每个awaitPromise.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
});