Я создаю расширение для массовой загрузки, которое загружает несколько файлов одновременно, используя chrome API загрузки. Чтобы добавить функцию отмены загрузки, я попробовал следующее:
let downloadKeys= Object.keys(downloadIds);
for (let i of downloadKeys) {
chrome.downloads.cancel(parseInt(i));
}
Проблема этого метода заключается в том, что для наборов данных с большими файлами он очищает очередь загрузки, но не может отменить при последующих загрузках. (Мое лучшее предположение состоит в том, что, поскольку эта программа работает асинхронно, эти строки кода выполняются до генерации идентификаторов загрузки.)
Поэтому я попытался добавить прослушиватель событий.
chrome.downloads.onCreated.addListener(cancelDownload);
function cancelDownload(item){
chrome.downloads.cancel(item.id);
}
Примечание : Я также пытался chrome .downloads.onDeterminingFileNema.addListener (), но обнаружил, что это работает лучше для моей цели.
Но проблема в том, что если пользователь начинает загрузку снова после отмены загрузки, слушатель событий отменяет и эти новые загрузки. Поэтому я добавил removeListener.
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.message == "start-download"){
chrome.downloads.onCreated.removeListener(cancelDownload)
startDownload();
}
else if (request.message == "cancel-download"){
chrome.downloads.onCreated.addListener(cancelDownload);
function cancelDownload(item){
chrome.downloads.cancel(item.id);
}
}
else{
//do something
}
});
Но removeListener не работает, поэтому новые загрузки все еще отменяются. Тем не менее, даже если бы это работало, для отмены всех загрузок таким образом требуется время (так как мы загружаем тысячи файлов), поэтому это все равно не сработало бы для моей цели.
Может кто-нибудь предложить мне способ отменить эти текущие загрузки, не мешая другим задачам загрузки?