我有一个简单的插件,可以使用Downloads.jsm和Task.jsm拦截新的下载,如上一个问题所示:
Intercept new downloads in Firefox Addon SDK
这个想法是附加组件应该执行以下操作:
使用以下代码,我可以拦截下载并获取源和目标等信息,但取消和删除下载会导致一些问题。
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Task.spawn(function() {
let list = yield Downloads.getList(Downloads.ALL);
let view = {
onDownloadAdded: download => {
console.log("Added", download);
// cancel the download
download.cancel();
// finialize (remove partial data)
download.finalize(true);
// delete the partial data
download.removePartialData();
// remove it from the list
list.remove(download);
},
onDownloadChanged: download => console.log("Changed", download),
onDownloadRemoved: download => console.log("Removed", download)
};
yield list.addView(view);
});
我需要的DownloadList
和Download
个对象expose all the functions,但某些内容无法按预期运行。
虽然下载已从Firefox下载列表和下载库中删除,但我可以看到下载为"已取消"对finalize(true)
的调用不会删除部分文件下载(removePartialData
)也不会删除。
我认为这是因为未正确删除下载内容。即使它们在库中显示为已取消,如果我浏览到我的下载文件夹,我也可以看到.part文件正在增长,就好像下载仍在进行中一样。
我怀疑这可能是因为我试图在真正启动之前取消下载,所以下载可能无法正常处理cancel()
调用?
答案 0 :(得分:1)
嗯,那些API方法返回promises,即它或多或少立即返回并承诺在将来的某个时间执行请求的操作。因此,您需要等待承诺实际履行(或拒绝)。再次使用Task.jsm
:
const {Cu} = require("chrome");
Cu.import("resource://gre/modules/Downloads.jsm");
Cu.import("resource://gre/modules/Task.jsm");
let view = {
onDownloadAdded: download => {
Task.spawn(function() {
try {
console.log("Added", download);
// cancel the download
yield download.cancel();
// delete the partial data
yield download.removePartialData();
// remove it from the list
yield list.remove(download);
} catch (ex) {
console.error(ex);
}
});
},
onDownloadChanged: download => console.log("Changed", download),
onDownloadRemoved: download => console.log("Removed", download)
};
Task.spawn(function() {
let list = yield Downloads.getList(Downloads.ALL);
yield list.addView(view);
});