You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免用户取消SaveAs对话框时执行downloading.then内的代码?

解决用户取消保存对话框时避免执行Promise回调的问题

首先咱们得先揪出你代码里的核心问题:当你给browser.downloads.download()传入回调函数时,这个方法不会返回Promise,这就是控制台输出undefined和downloading is undefined的原因。你同时混用了回调和Promise两种调用方式,直接导致了后续的异常行为。

要实现「用户取消对话框时不执行then/catch里的目标代码」,正确的思路是只用Promise风格调用,然后在错误捕获环节区分「用户主动取消」和「其他下载错误」:

修改后的代码示例

const options = { 
  filename: 'dummyName.txt', 
  url: 'https://some.url', 
  conflictAction: 'uniquify', 
  saveAs: true 
};

// 不传回调函数,让方法返回标准Promise
browser.downloads.download(options)
  .then(() => {
    console.log('下载已启动');
  })
  .catch((error) => {
    // 判断是否是用户主动取消的下载操作
    if (error.message.includes('Download canceled by the user')) {
      // 用户取消时,仅做日志记录或直接跳过后续逻辑
      console.log('用户取消了下载');
      return; // 终止当前catch块的后续代码执行
    }
    // 非用户取消的其他错误,再执行对应的处理逻辑
    console.log('下载失败:', error);
  });

关键细节说明

  1. 移除回调函数:browser.downloads.download()只有在不传回调时才会返回Promise,这样你才能正确使用then和catch进行异步流程控制。
  2. 精准过滤取消错误:在catch块中通过错误信息判断是否为用户主动取消的操作,匹配成功后直接返回,避免执行你不想触发的代码。
  3. 避免风格混用:WebExtension的API大多同时支持回调和Promise,但绝对不要同时使用两种方式,否则会出现各种预期外的行为。

这样调整后,当用户取消保存对话框时,只会打印提示日志,不会执行你原本想规避的错误处理逻辑。

内容的提问来源于stack exchange,提问作者bobbyrne01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:15:06