API записей файлов: когда он будет завершен? - PullRequest
0 голосов
/ 26 января 2019

Я использую API для ввода файлов , чтобы читать файлы, перетаскиваемые на веб-страницу, и в конечном итоге загружать их.Требуется все виды сложного кода для итерации удаленных файлов, что выглядит как асинхронный (но это не ясно).Когда я не делаю ничего особенного, код завершается до того, как все файлы будут просмотрены.Так что определенно должна быть какая-то синхронизация на месте.

Вот мое текущее предположение:

element.on("drop", function(event) {
    // API spec: https://wicg.github.io/entries-api/
    if (event.originalEvent.dataTransfer.items) {
        addFileEntries(event.originalEvent.dataTransfer.items);
    }
    else {
        files = event.originalEvent.dataTransfer.files;
        upload(files);
    }
});

function addFileEntries(entries) {
    let files = [];
    asyncWaitCount++;
    for (const item of entries) {
        // kind will be "file" for file/directory entries
        if (item.kind === "file") {
            const entry = item.webkitGetAsEntry();
            addDroppedFile(entry, files);
        }
    }
    asyncWaitCount--;
    if (!asyncWaitCount) upload(files);
}

function addDroppedFile(entry, files) {
    if (entry.isDirectory) {
        let reader = entry.createReader();
        asyncWaitCount++;
        let readBatch = function() {
            reader.readEntries(entries => {
                if (entries.length === 0) {
                    asyncWaitCount--;
                    if (!asyncWaitCount) upload(files);
                    return;
                }
                entries.forEach(entry => addDroppedFile(entry, files));
                readBatch();
            }, error => console.warn(error));
        };
        readBatch();
    }
    if (entry.isFile) {
        asyncWaitCount++;
        entry.file(file => {
            files.push({ file: file, path: entry.fullPath.substring(1) });
            asyncWaitCount--;
            if (!asyncWaitCount) upload(files);
        }, error => console.warn(error));
    }
}

function upload(files) {
    // The actual uploading of all dropped files
}

Но я не совсем доволен использованием asyncWaitCount.Это не выглядит слишком крепким.Например, значение должно быть 1, а затем 0 снова в функции addFileEntries, потому что вызовы addDroppedFile, вероятно, все занимают некоторое время в фоновом режиме.

Так как вы справляетесь с этим?Когда вы знаете, что все удаленные файлы были прочитаны, и теперь список заполнен?

...