Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.01.2022, 10:31
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

Множественное скачивание 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) он довольно лихо скачивает маленькие файлы, но если попадается большой, то задержки не хватает и он может его пропустить.

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

Сейчас эта функция висит здесь на кнопках нарезки товаров и разделов. Соответственно разделы иногда пропускаются, так как их размер больше.
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2022, 10:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от sovsem-nub
Как можно избежать этого "костыля" с задержкой и начинать скачивать следующий файл, если предыдущий уже скачался?
Например перейти на промисы...
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2022, 17:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от ksa
Например перейти на промисы...
На промисы тут только sleep перевести можно и нужно.
Но это не поможет. Мы не сможем узнать, когда именно кончилась выгрузка файла на комп. Только задержу наугад ставить.
Единственное, что можно сделать - создавать для каждого файла новый link , если это не перегрузит систему.
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2022, 20:01
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск