如何避免用户取消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); });
关键细节说明
- 移除回调函数:
browser.downloads.download()只有在不传回调时才会返回Promise,这样你才能正确使用then和catch进行异步流程控制。 - 精准过滤取消错误:在
catch块中通过错误信息判断是否为用户主动取消的操作,匹配成功后直接返回,避免执行你不想触发的代码。 - 避免风格混用:WebExtension的API大多同时支持回调和Promise,但绝对不要同时使用两种方式,否则会出现各种预期外的行为。
这样调整后,当用户取消保存对话框时,只会打印提示日志,不会执行你原本想规避的错误处理逻辑。
内容的提问来源于stack exchange,提问作者bobbyrne01
相关产品推荐
相关产品推荐

