首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Downloads.jsm -调用cancel()实际上不取消下载吗?

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

Stack Overflow用户
提问于 2014-06-28 13:46:14
回答 1查看 349关注 0票数 3

我有一个简单的插件,可以使用Downloads.jsm和Task.jsm截取新的下载,就像我在前面的问题中建议的那样:

拦截Firefox Addon SDK中的新下载

其想法是,外接程序应该执行以下操作:

  1. 截取下载
  2. 取消下载
  3. 删除已下载的部分数据
  4. 从下载历史列表中删除下载
  5. 将下载信息发送给外部下载管理器。

使用下面的代码,我可以拦截下载并获取它的信息,比如源和目的地,但是取消和删除下载会给我带来一些问题。

代码语言:javascript
复制
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对象公开所有函数,但是有些东西没有像预期的那样工作。

尽管下载已从Firefox下载列表中删除,而且在下载库中,我可以将下载视为“取消”,但对finalize(true)的调用并不会删除部分文件下载(removePartialData也不会)。

我相信这是因为下载没有被正确删除。即使它们在库中显示为取消,如果我浏览到我的下载文件夹,我可以看到.part文件在增长,就好像下载还在进行中一样。

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

EN

回答 1

Stack Overflow用户

发布于 2014-06-28 14:30:26

好的,这些API方法返回承诺,也就是说,它或多或少会立即返回并承诺在将来的某个时候执行所请求的操作。因此,你需要等待承诺真正实现(或被拒绝)。再次使用Task.jsm

代码语言:javascript
复制
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);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24467443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档