Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Множественное скачивание Blob пропускает некоторые файлы (https://javascript.ru/forum/events/83534-mnozhestvennoe-skachivanie-blob-propuskaet-nekotorye-fajjly.html)

sovsem-nub 04.01.2022 10:31

Множественное скачивание Blob пропускает некоторые файлы
 
Есть простая функция, которая получает текст и имя файла под которым нужно сохранить этот текст и соответственно через Blob делает ссылку, кликает по ней, загружает файл и удаляет эту сылку



function sleep(milliseconds) {
  const date = Date.now();
  let currentDate = null;
  do {
    currentDate = Date.now();
  } while (currentDate - date < milliseconds);
}










function save(text, filename){
var blob = new Blob([text], {type: "octet/stream"});
link.href = URL.createObjectURL(blob);
link.download = filename;
	link.click();

sleep(100);
URL.revokeObjectURL(link.href);
}



Один файл этот код скачивает замечательно, но когда в эту функцию залетает одновременно сто задач, то примерно 10% файлов не сохраняется. Посмотрел, что люди просто вставляют паузу 500 внутрь функции и тогда все идет медленно, но верно. Стал экспериментировать с задержкой и при sleep(100) он довольно лихо скачивает маленькие файлы, но если попадается большой, то задержки не хватает и он может его пропустить.

Как можно избежать этого "костыля" с задержкой и начинать скачивать следующий файл, если предыдущий уже скачался? Никакого промежуточного массива ссылок для скачивания нет. Задания в функцию летят "неупорядоченной толпой"

Сейчас эта функция висит здесь на кнопках нарезки товаров и разделов. Соответственно разделы иногда пропускаются, так как их размер больше.

ksa 04.01.2022 10:40

Цитата:

Сообщение от sovsem-nub
Как можно избежать этого "костыля" с задержкой и начинать скачивать следующий файл, если предыдущий уже скачался?

Например перейти на промисы...

voraa 04.01.2022 17:15

Цитата:

Сообщение от ksa
Например перейти на промисы...

На промисы тут только sleep перевести можно и нужно.
Но это не поможет. Мы не сможем узнать, когда именно кончилась выгрузка файла на комп. Только задержу наугад ставить.
Единственное, что можно сделать - создавать для каждого файла новый link , если это не перегрузит систему.

ksa 04.01.2022 20:01

Цитата:

Сообщение от voraa
Мы не сможем узнать, когда именно кончилась выгрузка файла на комп.

Тогда твоя задача не решаема...


Часовой пояс GMT +3, время: 20:36.