尝试扩展时遇到问题。扩展名的作用很简单,我有一个带有图像序列的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)
答案 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)
函数内部。