如何使Chrome Downloads API等待下载结束?

时间:2018-07-30 19:15:23

标签: javascript google-chrome-extension

尝试扩展时遇到问题。扩展名的作用很简单,我有一个带有图像序列的URL,我获得了所有图像的src,然后使用chrome的Downloads API将它们下载到文件夹中。我已经安装了它,并且运行良好,但是有一个问题,所有下载都连续开始,这会导致某些下载失败,因此我尝试让Chrome等待下载完成后再开始下载。

首先,我尝试搜索Downloads API是否具有验证此方法的方法,但是至少从我搜索的内容来看,我没有找到获取DownloadItem的方法,只有两种方法可以做到这一点,使用搜索和自己的下载方法,但都使用了一个似乎是异步的回调,然后我尝试在下载之前添加一小段时间,并使用其中一种方法更改其条件,但始终会循环,因为它在while循环不会继续回调它们,与handleChanged()之类的全局方法相同。那么,我如何让Chrome浏览器等到下载结束后才开始另一个下载而不会自行循环播放?

这是我用于下载的代码的一部分

    for(let i=0; i<images.length; i++) {
        // Download image
        while(currentDownload) {
            if (cont == 10000000) {
                currentDownload = false;
            } else {
                cont = cont + 1;
            }
        };
        cont = 0;
        currentDownload = true;
        var downloadUrl = images[i].split(" . ")[0];
        img = images[i].split(" . ")[1];
        console.log(name+"/"+img);
        var downloading = chrome.downloads.download({
            url: downloadUrl,
            filename: name+"/"+img,
            conflictAction: 'uniquify'
        });

    }

我之所以搁浅是因为其他测试的循环使我的浏览器崩溃了,但是最好有一种方法可以检查直到下载结束之后再开始下一个下载。这是我用来进行更改的侦听器,为了清楚起见,我试图将搜索方法放在prev代码上,即使是在一段时间内,它也没有起作用。 currentDownload是全局变量。

function handleChanged(delta) {
    //if (urlRegexD.test(pest)) {

        if (delta.state && delta.state.current === "complete") {
            console.log(`Download ${delta.id} has completed.`);
            currentDownload = false;

        }
    //}
}

chrome.downloads.onChanged.addListener(handleChanged)

1 个答案:

答案 0 :(得分:1)

回调:

将一个“步骤”提取到一个函数中,然后从onChanged事件侦听器中调用它。

 version: 2
 jobs:
   build:
     branches:
       ignore: 
         - gh-pages 

用法:function downloadSequentially(urls, callback) { let index = 0; let currentId; chrome.downloads.onChanged.addListener(onChanged); next(); function next() { if (index >= urls.length) { chrome.downloads.onChanged.removeListener(onChanged); callback(); return; } const url = urls[index]; index++; if (url) { chrome.downloads.download({ url, }, id => { currentId = id; }); } } function onChanged({id, state}) { if (id === currentId && state && state.current !== 'in_progress') { next(); } } }


异步/等待

在Promise中包装API调用并等待它们。

downloadSequentially(arrayOfStringUrls, () => console.log('done'))

用法:async function downloadSequentially(urls) { for (const url of urls) { if (!url) continue; const currentId = await download(url); const success = await onDownloadComplete(currentId); } } function download(url) { return new Promise(resolve => chrome.downloads.download({url}, resolve)); } function onDownloadComplete(itemId) { return new Promise(resolve => { chrome.downloads.onChanged.addListener(function onChanged({id, state}) { if (id === itemId && state && state.current !== 'in_progress') { chrome.downloads.onChanged.removeListener(onChanged); resolve(state.current === 'complete'); } }); }); } -在await downloadSequentially(arrayOfStringUrls)函数内部。