Downloads.jsm - 调用cancel()实际上不会取消下载?

时间:2014-06-28 13:46:15

标签: javascript firefox-addon firefox-addon-sdk

我有一个简单的插件,可以使用Downloads.jsm和Task.jsm拦截新的下载,如上一个问题所示:

Intercept new downloads in Firefox Addon SDK

这个想法是附加组件应该执行以下操作:

  1. 拦截下载
  2. 取消下载
  3. 删除已下载的所有部分数据
  4. 从下载历史记录列表中删除下载
  5. 将下载信息发送给外部下载管理器
  6. 使用以下代码,我可以拦截下载并获取源和目标等信息,但取消和删除下载会导致一些问题。

    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);
    });
    

    我需要的DownloadListDownload个对象expose all the functions,但某些内容无法按预期运行。

    虽然下载已从Firefox下载列表和下载库中删除,但我可以看到下载为"已取消"对finalize(true)的调用不会删除部分文件下载(removePartialData)也不会删除。

    我认为这是因为未正确删除下载内容。即使它们在库中显示为已取消,如果我浏览到我的下载文件夹,我也可以看到.part文件正在增长,就好像下载仍在进行中一样。

    我怀疑这可能是因为我试图在真正启动之前取消下载,所以下载可能无法正常处理cancel()调用?

1 个答案:

答案 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);
});