Я использую 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
, вероятно, все занимают некоторое время в фоновом режиме.
Так как вы справляетесь с этим?Когда вы знаете, что все удаленные файлы были прочитаны, и теперь список заполнен?