Как дождаться завершения асинхронного вызова JSZip .forEach () перед запуском следующего кода? - PullRequest
0 голосов
/ 20 января 2019

У меня есть глобальная переменная под названием «данные», которая изменяется внутри цикла 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 голосов
/ 20 января 2019

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
});
0 голосов
/ 20 января 2019

Я прочитал документацию JSZip и не нашел способа преобразовать forEach(callback) в массив Promise s.Таким образом, единственный способ, которым я придумал, - это получить количество файлов и использовать счетчик.

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()
    }
});

Я протестировал приведенный выше код, и он заработал.Дайте мне знать, если есть проблема.

...