Userscript GM_download не загружает весь набор файлов за короткий период

#javascript #download #tampermonkey #userscripts

#javascript #Скачать #tampermonkey #пользовательские скрипты

Вопрос:

Этот скрипт предназначен для получения списка URL-адресов изображений и загрузки их всех как можно быстрее. Проблема в том, что он пропускает некоторые, и я не уверен, почему. Связано ли это с ограничением Chrome количества параллельных загрузок? Я попытался учесть это с помощью onload функции GM_download .

Он загружает около половины файлов из списка. Вероятность успеха возрастает, если я увеличиваю sleep() таймер с 200 на что-то вроде 2000 , но я не знаю, почему, учитывая, что я полагаюсь на onload функцию, чтобы правильно указать, когда загрузка завершена (и, следовательно, когда Chrome может принять новую загрузку)

 // ==UserScript==
// @name          Image Save Test
// @namespace     ist
// @include       *testimages.juliaimages.org/
// @version       1.0.0
// @run-at        document-end
// @noframes      true
// @grant         GM_download
// ==/UserScript==

var currentDownloads = 0;
var queue = [  'https://testimages.juliaimages.org/thumbnails/autumn_leaves.png',
               'https://testimages.juliaimages.org/thumbnails/blobs.png',
               'https://testimages.juliaimages.org/thumbnails/cameraman.png',
               'https://testimages.juliaimages.org/thumbnails/fabio_color_512.png',
               'https://testimages.juliaimages.org/thumbnails/earth_apollo17.png',
               'https://testimages.juliaimages.org/thumbnails/fabio_gray_256.png',
               'https://testimages.juliaimages.org/thumbnails/hela-cells.png',
               'https://testimages.juliaimages.org/thumbnails/lake_gray.png',
               'https://testimages.juliaimages.org/thumbnails/house.png',
               'https://testimages.juliaimages.org/thumbnails/jetplane.png',
               'https://testimages.juliaimages.org/thumbnails/lake_color.png',
               'https://testimages.juliaimages.org/thumbnails/lena_gray_16bit.png',
               'https://testimages.juliaimages.org/thumbnails/lighthouse.png',
               'https://testimages.juliaimages.org/thumbnails/mandril_color.png',
               'https://testimages.juliaimages.org/thumbnails/mandril_gray.png',
               'https://testimages.juliaimages.org/thumbnails/mountainstream.png',
               'https://testimages.juliaimages.org/thumbnails/peppers_color.png',
               'https://testimages.juliaimages.org/thumbnails/moonsurface.png',
               'https://testimages.juliaimages.org/thumbnails/peppers_gray.png',
               'https://testimages.juliaimages.org/thumbnails/toucan.png',
               'https://testimages.juliaimages.org/thumbnails/pirate.png'];

(async function() {
   while (queue.length > 0) {
      if (currentDownloads > 5) {
         await sleep(200);
         continue;
      }
      
      var item = queue.shift();
      
      (function(_item) {
         GM_download({
            url: _item,
            name: _item.match(/([0-9A-Za-z _-] )(?=.png)/)[0],
            saveAs: false,
            onerror: function(error) {
               queue.unshift(_item);
               currentDownloads--;
            },
            onload: function() {
               currentDownloads--;
            }
         });
         
         currentDownloads  ;
      })(item);
   }
})();

function sleep(ms) {
   return new Promise(resolve => setTimeout(resolve, ms));
}
  

Комментарии:

1. Ваш код работает для меня в Violentmonkey, так что, вероятно, это ошибка в Tampermonkey.

Ответ №1:

Это было исправлено в БЕТА-версии TM 4.12.6126. derjanb ограничил количество загружаемых файлов до 3 каждые 500 мс:

Эта проблема должна быть исправлена в БЕТА-версии TM 4.12.6126. 😅 Теперь я ограничиваю количество загрузок до 3 на 500 мс. Здесь это хорошо работает, и я думаю, что общая скорость не так важна. Тем более, что установка режима загрузки на «Browser API» устраняет полную проблему.


Обходной путь: в настройках установите режим конфигурации на расширенный, затем прокрутите и в разделе Загрузки БЕТА-версии установите режим загрузки для API браузера. (источник)