Используя webkitGetAsEntry (), как получить список всех переданных файлов синхронно - PullRequest
0 голосов
/ 27 января 2020

У меня есть этот метод, который вызывает callback () для каждого файла, который сбрасывается в некоторый контейнер.

Однако, если отбрасывается несколько файлов, этот метод будет вызывать callback () для каждого файла.

Как мне превратить это в синхронную функцию, чтобы callback () вызывался только один раз внутри этого метода, после того как все файлы были прочитаны? Я попробовал несколько асин c / await magi c, но безуспешно.

TL; DR: я хотел бы преобразовать этот метод в callback () только один раз со ВСЕМИ файлами , в конце, когда все файлы и подфайлы каталога были прочитаны в некоторый массив.

onDropFiles = e => {
    e.preventDefault();
    const { callback } = this.props;
    const items = e.dataTransfer.items;
    if (!items.length) {
        return;
    }
    const traverseFileTree = item => {
        if (item.isFile) {
            item.file(file => {
                callback([file]);
            });
            return;
        }
        const dirReader = item.createReader();
        dirReader.readEntries(entries => {
            for (let i = 0; i < entries.length; i++) {
                traverseFileTree(entries[i]);
            }
        });
    };
    for (let i = 0; i < items.length; i++) {
        traverseFileTree(items[i].webkitGetAsEntry());
    }
}
...