Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Promise错误处理:在catch后终止链式then执行的策略_创想鸟

Promise错误处理:在catch后终止链式then执行的策略

Promise错误处理:在catch后终止链式then执行的策略

当javascript promise链中的`.catch()`块被触发时,默认行为是返回一个已解决的promise,这可能导致后续的`.then()`块意外执行。本教程将深入探讨这一机制,并提供两种有效策略来控制promise链的执行流:一是将`.catch()`移至链的末尾进行全局错误处理,二是利用`promise.reject()`在`.catch()`内部显式地重新抛出拒绝,从而确保在错误发生后链式`.then()`调用能够提前终止。

在异步编程中,Promise 提供了一种强大的方式来管理链式操作和错误处理。然而,开发者有时会遇到一个常见问题:即使在 Promise.catch() 块中处理了错误,后续的 Promise.then() 块仍然会被执行。这是因为 catch() 方法本身会返回一个新的 Promise,并且如果其回调函数没有抛出错误或返回一个被拒绝的 Promise,那么这个新的 Promise 默认会以其回调函数的返回值(或 undefined)解析。

理解默认行为

考虑以下示例代码,它试图从一个无效 URL 获取数据:

fetch('https://some.invalid.url')  .then(resp => resp.text())  .catch(err => console.log("got error: " + err))  .then(text => console.log("got text: " + text));

运行这段代码,你会观察到以下输出:

"got error: TypeError: Failed to fetch""got text: undefined"

尽管 fetch 操作失败并触发了 .catch() 块,但后续的 .then(text => console.log(“got text: ” + text)) 依然被执行了。这是因为 .catch() 内部的 console.log() 调用返回 undefined,而 .catch() 方法将这个 undefined 作为值解析为一个新的 Promise。因此,链中的下一个 .then() 接收到这个解析的 Promise,并打印出 undefined。

为了在 catch 之后阻止 then 的执行,我们需要明确地控制 Promise 链的流向。下面介绍两种有效的策略。

策略一:将 .catch() 移动到链的末尾

这是处理 Promise 链中错误的最常见和推荐做法。通过将 .catch() 放置在整个链的末尾,它将捕获之前任何 .then() 或初始 Promise 抛出的任何错误。一旦错误发生,Promise 链将跳过所有中间的 .then() 块,直接跳转到最近的 .catch() 块。

fetch('https://some.invalid.url')  .then(resp => resp.text())  .then(text => console.log("got text: " + text)) // 如果前面有错误,此then会被跳过  .catch(err => console.log("got error: " + err)); // 捕获整个链中的错误

工作原理:当 fetch 操作失败时,它会返回一个被拒绝的 Promise。这个拒绝会沿着 Promise 链向下传播,跳过所有后续的 .then() 回调,直到遇到第一个 .catch() 回调。因此,console.log(“got text: ” + text) 永远不会被执行。

优点:

简洁明了: 错误处理逻辑集中在链的末尾,易于理解和维护。全局性: 捕获链中任何环节发生的错误。符合预期: 错误发生后,链式操作自然终止。

适用场景:当你希望 Promise 链中的任何一个步骤失败时,整个链的后续操作都应该停止,并且只进行一次统一的错误处理。

策略二:在 .catch() 中显式地重新拒绝 Promise

如果你的设计要求在链的中间处理一个错误(例如,记录错误信息),但仍然希望阻止该错误之后的所有 .then() 块执行,你可以选择在 .catch() 块内部显式地返回一个被拒绝的 Promise。

fetch('https://some.invalid.url')  .then(resp => resp.text())  .catch(err => {    console.log("got error: " + err); // 处理错误,例如记录日志    return Promise.reject(err);       // 重新拒绝Promise,阻止后续then执行  })  .then(text => console.log("got text: " + text)); // 此then不会被执行

工作原理:当 fetch 失败时,第一个 .catch() 块被触发。它执行 console.log(),然后 return Promise.reject(err) 会创建一个新的被拒绝的 Promise,并将其返回。这个被拒绝的 Promise 会继续沿着链向下传播,导致后续的 .then() 块被跳过。

输出结果:

"got error: TypeError: Failed to fetch"

注意事项:

未捕获的拒绝 (Unhandled Rejection): 如果在 return Promise.reject(err) 之后,Promise 链的末尾没有另一个 .catch() 来捕获这个重新拒绝的 Promise,那么它将触发一个 unhandledrejection 事件(在浏览器环境中)或导致进程崩溃(在 Node.js 环境中,取决于版本和配置)。用途: 这种方法适用于你需要在特定位置处理错误(例如,进行一些清理或日志记录),然后明确地将错误传播下去,以确保后续操作不会在错误状态下继续执行。

何时使用此策略:当你需要在链的中间处理错误(例如,根据错误类型执行不同操作),并且根据处理结果决定是恢复链(返回一个解析的 Promise)还是终止链(返回一个拒绝的 Promise)。在需要终止链的情况下,return Promise.reject(err) 是必要的。

总结与最佳实践

理解 Promise.catch() 的默认行为是掌握 Promise 链式调用的关键。为了在错误发生后有效地终止后续的 .then() 块执行,请遵循以下原则:

全局错误处理: 对于大多数情况,将 .catch() 放在 Promise 链的末尾是最佳实践。这能确保任何前置步骤的错误都能被捕获,并且整个链在错误发生后自然终止。局部错误处理与终止: 如果你需要在链的中间处理一个错误,并明确地阻止后续 .then() 的执行,可以在 .catch() 块中返回 Promise.reject(err)。但务必确保这个重新拒绝的 Promise 最终会被链中的某个 .catch() 捕获,以避免未处理的拒绝。错误恢复: 如果你在 .catch() 中处理错误后希望 Promise 链能够恢复并继续执行后续操作(例如,提供一个默认值),那么就不要抛出错误或返回 Promise.reject(),而是返回一个解析的值。例如:

fetch('https://some.invalid.url')  .then(resp => resp.json())  .catch(err => {    console.error("Fetch failed, returning default data:", err);    return { data: [] }; // 返回一个解析的值,链会继续  })  .then(result => console.log("Processed result:", result));

在这种情况下,catch 块返回了一个解析的值 { data: [] },后续的 .then() 就会接收到这个值并继续执行。

通过选择合适的策略,你可以更精确地控制 Promise 链的执行流,构建出健壮且易于维护的异步代码。

以上就是Promise错误处理:在catch后终止链式then执行的策略的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539490.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
TypeScript/JavaScript:高效查找数组中首个唯一ID对象
上一篇 2025年12月21日 11:39:05
如何将HTML表格多行数据保存到Google Sheets
下一篇 2025年12月21日 11:39:20

相关推荐

  • 抖音浏览量1.3万是什么意思?如何增加抖音浏览量?三个关键指标揭秘抖音浏览量

    抖音浏览量1.3万是什么意思?如何增加抖音浏览量?三个关键指标揭秘抖音浏览量抖音浏览量1.3万是什么意思?如何增加抖音浏览量?三个关键指标揭秘抖音浏览量抖音浏览量1.3万是什么意思?如何增加抖音浏览量?三个关键指标揭秘抖音浏览量抖音浏览量1.3万是什么意思?如何增加抖音浏览量?三个关键指标揭秘抖音浏览量

    当你的抖音视频突破1.3万浏览量时,这不仅是数字的变化,更是内容价值的体现。这个量级意味着视频已被超过1.3万人真实观看,在抖音的流量池中属于中等偏上水平,既验证了内容的基本吸引力,也打开了更高级别流量推荐的窗口。想要持续放大这种传播效应,需要掌握平台算法逻辑与用户行为规律。 一、抖音浏览量1.3万…

    2026年9月27日 • 用户投稿
    200
  • Win7电脑开机画面怎么设置?

    Win7电脑开机画面怎么设置?Win7电脑开机画面怎么设置?Win7电脑开机画面怎么设置?Win7电脑开机画面怎么设置?

    在通常的情况下,电脑开机都是会显示开机画面的,而这些画面一般也都是系统设置好的,不过也会有一些追求个性化的盆友会想要进行更换电脑开机画面的。当还是有部分的盆友知道电脑开机画面怎么更换的,所以今天小编给大家简单的介绍一下更换开机画面的方法。 1、点击“开始”菜单,在运行内输入regedit然后回车,打…

    2026年9月27日 • 用户投稿
    100
  • firefox浏览器如何清除自动填充的表单数据 Firefox浏览器清除表单自动填充历史

    firefox浏览器如何清除自动填充的表单数据 Firefox浏览器清除表单自动填充历史firefox浏览器如何清除自动填充的表单数据 Firefox浏览器清除表单自动填充历史firefox浏览器如何清除自动填充的表单数据 Firefox浏览器清除表单自动填充历史firefox浏览器如何清除自动填充的表单数据 Firefox浏览器清除表单自动填充历史

    首先清除Firefox表单自动填充中的过时信息,可通过隐私设置批量删除全部历史,或使用Shift+Delete删除特定条目,还可禁用表单记忆功能以阻止新数据保存。 如果您在使用Firefox浏览器时发现表单自动填充的内容包含过时或错误的信息,可能会影响您输入的准确性和效率。为了确保填写表单时只显示最…

    2026年9月27日 • 用户投稿
    100
  • cpu天梯图最新排名2025 手机cpu处理器排行榜天梯图top10

    cpu天梯图最新排名2025 手机cpu处理器排行榜天梯图top10cpu天梯图最新排名2025 手机cpu处理器排行榜天梯图top10cpu天梯图最新排名2025 手机cpu处理器排行榜天梯图top10cpu天梯图最新排名2025 手机cpu处理器排行榜天梯图top10

    骁龙 8 Gen4、天玑 9400、A18 Pro 和 Exynos 2400 是当前旗舰处理器,分别适用于高端游戏、AI 创作、iOS 生态和游戏玩家。 立即进入“各种好用的网站点击进入”; 一、旗舰处理器(性能天花板) 1. 高通骁龙 8 Gen4 核心配置:1×Cortex-X5(3.8GHz…

    2026年9月27日 • 用户投稿
    000
  • Gemini可以预测超新星爆发吗 Gemini天体事件预警系统

    Gemini可以预测超新星爆发吗 Gemini天体事件预警系统Gemini可以预测超新星爆发吗 Gemini天体事件预警系统Gemini可以预测超新星爆发吗 Gemini天体事件预警系统Gemini可以预测超新星爆发吗 Gemini天体事件预警系统

    谷歌gemini 2.5在超新星爆发预测中展现出强大能力,其通过分析历史数据与实时观测信息识别关键特征,如恒星亮度变化、光谱演变和环境扰动;构建天体事件预警系统需五个步骤:1.数据收集,2.数据处理,3.模式识别,4.实时监控,5.快速响应;然而实际应用中仍面临数据质量不一、标准不统一、训练样本不足…

    2026年9月27日 • 用户投稿
    000
  • 谈谈你对Java抽象类和接口的理解,以及它们之间的区别

    谈谈你对Java抽象类和接口的理解,以及它们之间的区别谈谈你对Java抽象类和接口的理解,以及它们之间的区别谈谈你对Java抽象类和接口的理解,以及它们之间的区别谈谈你对Java抽象类和接口的理解,以及它们之间的区别

    抽象类提供共享状态和部分实现,适用于“is-a”关系;接口定义行为契约,支持多重继承,适用于“can-do”关系。 Java的抽象类和接口,在我看来,是面向对象设计中实现多态和代码复用的两大利器,但它们的设计哲学和应用场景有着本质的区别。简单来说,抽象类更像是一个“半成品”的父类,它允许你定义一些通…

    2026年9月27日 • 用户投稿
    000
  • Claude如何优化多语言翻译 Claude语言模型微调方法

    Claude如何优化多语言翻译 Claude语言模型微调方法Claude如何优化多语言翻译 Claude语言模型微调方法Claude如何优化多语言翻译 Claude语言模型微调方法Claude如何优化多语言翻译 Claude语言模型微调方法

    优化claude多语言翻译能力的核心在于理解其运作机制并结合数据与策略进行干预,主要通过提示工程和模型微调两个层面实现。1. 提示工程是第一把利器,通过提供上下文、明确指令和高质量示例提升表现,例如指定翻译风格、受众或术语处理方式,并采用少样本学习引导模型理解偏好。2. 当面对专业领域或低资源语言时…

    2026年9月27日 • 用户投稿
    100
  • 夸克怎么设置默认搜索引擎_夸克浏览器默认搜索工具修改方法

    夸克怎么设置默认搜索引擎_夸克浏览器默认搜索工具修改方法夸克怎么设置默认搜索引擎_夸克浏览器默认搜索工具修改方法夸克怎么设置默认搜索引擎_夸克浏览器默认搜索工具修改方法夸克怎么设置默认搜索引擎_夸克浏览器默认搜索工具修改方法

    1、打开夸克浏览器,点击右下角三横线菜单;2、进入设置→通用或搜索与浏览→搜索引擎;3、选择百度、谷歌、必应或夸克AI搜索设为默认,新标签页和地址栏将同步生效。 如果您在使用夸克浏览器时希望更改默认的搜索服务,以便每次输入关键词时自动调用您偏好的搜索引擎,可以按照以下步骤进行调整。此设置将直接影响新…

    2026年9月27日 • 用户投稿
    000
  • 动漫《K》人物图文介绍

    动漫《K》人物图文介绍动漫《K》人物图文介绍动漫《K》人物图文介绍动漫《K》人物图文介绍

    《k》是由日本gohands公司策划和制作的一部原创电视动画,于2012年10月4日开始播出,全系列共13集。故事的舞台设定在一个架空的现代日本,主要讲述了七位被称为“王”的异能者之间的纷争与战斗传奇。 苇中学园 / 白银氏族 白米党 伊佐那社 其灵魂与人格的真实身份是第一王权者“白银之王”阿道夫·…

    2026年9月27日 • 用户投稿
    200
  • DeepSeek如何配置灰度发布 DeepSeek渐进式更新策略

    DeepSeek如何配置灰度发布 DeepSeek渐进式更新策略DeepSeek如何配置灰度发布 DeepSeek渐进式更新策略DeepSeek如何配置灰度发布 DeepSeek渐进式更新策略DeepSeek如何配置灰度发布 DeepSeek渐进式更新策略

    灰度发布的配置应从模型版本管理、流量路由控制、实时监控与反馈、自动回滚机制等关键步骤入手。首先,确保新旧模型可并行部署并能按规则切换;其次,通过ingress控制器按比例分配流量;接着,持续监控qps、错误率等指标;最后,设置自动回滚机制以便异常时快速切换。此外,渐进式学习率预热有助于训练阶段的稳定…

    2026年9月27日 • 用户投稿
    000
  • 请写一个必然会产生死锁的示例程序

    请写一个必然会产生死锁的示例程序请写一个必然会产生死锁的示例程序请写一个必然会产生死锁的示例程序请写一个必然会产生死锁的示例程序

    死锁必然发生,因代码满足互斥、持有并等待、不可抢占和循环等待四条件:线程1持lock_a等lock_b,线程2持lock_b等lock_a,形成循环依赖,导致双方永久阻塞。 死锁,在多线程编程里,它就像一个狡猾的陷阱,一旦触发,程序就会陷入无尽的等待。它不是一个“可能”发生的问题,而是在特定条件下“…

    2026年9月27日 • 用户投稿
    100
  • Temp文件夹是什么?win10系统如何删除Temp文件夹?

    Temp文件夹是什么?win10系统如何删除Temp文件夹?Temp文件夹是什么?win10系统如何删除Temp文件夹?Temp文件夹是什么?win10系统如何删除Temp文件夹?Temp文件夹是什么?win10系统如何删除Temp文件夹?

    许多使用电脑的用户会在系统的系统盘里发现一个名为temp的文件夹,这实际上是一个系统临时文件夹,主要用来存储系统运行时产生的临时文件。下面,小编就为大家讲解一下如何删除temp文件夹。 什么是Temp文件夹? Temp文件夹是系统临时文件夹,用于存放浏览器缓存、系统运行时生成的临时数据等。如果需要清…

    2026年9月27日 • 用户投稿
    200
  • 作业帮App如何使用AI答疑功能解答难题_作业帮App AI答疑的精准应用技巧

    作业帮App如何使用AI答疑功能解答难题_作业帮App AI答疑的精准应用技巧作业帮App如何使用AI答疑功能解答难题_作业帮App AI答疑的精准应用技巧作业帮App如何使用AI答疑功能解答难题_作业帮App AI答疑的精准应用技巧作业帮App如何使用AI答疑功能解答难题_作业帮App AI答疑的精准应用技巧

    作业帮App的AI答疑功能可通过拍照搜题、手动输入、语音提问和AI精准学四种方式高效解决学习难题,先提供答案再详解步骤,助力学生快速掌握知识点。 如果您在学习过程中遇到难以理解的题目,作业帮App的AI答疑功能可以提供快速且详细的解题思路与答案。以下是几种使用该功能的精准方法,帮助您高效解决各类学科…

    2026年9月27日 • 用户投稿
    800
  • Laravel认证系统怎么快速搭建_Laravel认证系统快速搭建方法

    最直接的方法是使用Laravel Breeze,它提供完整的认证功能。首先创建项目并安装Breeze,运行php artisan breeze:install选择Blade模板,接着安装前端依赖并编译资源,最后执行数据库迁移。完成后即可访问注册和登录页面。Breeze轻量简洁,适合中小型项目;若需团…

    2026年9月27日
    100
  • qq浏览器下载任务已存在怎么办 QQ浏览器重复下载任务处理方法

    qq浏览器下载任务已存在怎么办 QQ浏览器重复下载任务处理方法qq浏览器下载任务已存在怎么办 QQ浏览器重复下载任务处理方法qq浏览器下载任务已存在怎么办 QQ浏览器重复下载任务处理方法qq浏览器下载任务已存在怎么办 QQ浏览器重复下载任务处理方法

    答案:可通过管理下载任务、清除缓存、调整并发数或更改文件名解决。首先检查并删除重复任务,清理下载记录与缓存数据,修改同时下载数量上限,或更改文件名及保存路径以绕过系统限制,重新发起下载即可成功创建新任务。 如果您尝试通过QQ浏览器下载文件,但系统提示“下载任务已存在”,这通常是因为该文件的下载请求已…

    2026年9月27日 • 用户投稿
    400
  • sublime怎么配置lua lsp_sublime Lua LSP配置教程

    sublime怎么配置lua lsp_sublime Lua LSP配置教程sublime怎么配置lua lsp_sublime Lua LSP配置教程sublime怎么配置lua lsp_sublime Lua LSP配置教程sublime怎么配置lua lsp_sublime Lua LSP配置教程

    首先安装LSP和LuaExtended插件,再安装sumneko/lua-language-server,最后在LSP设置中配置正确路径,即可实现智能提示、跳转定义等功能。 要让 Sublime Text 支持 Lua 语言的智能提示、跳转定义、自动补全等高级功能,配置 LSP(Language S…

    2026年9月27日 • 用户投稿
    100
  • 《2XKO》公布亚索实机预告片 风墙突刺攻防一体

    《2XKO》公布亚索实机预告片 风墙突刺攻防一体《2XKO》公布亚索实机预告片 风墙突刺攻防一体《2XKO》公布亚索实机预告片 风墙突刺攻防一体《2XKO》公布亚索实机预告片 风墙突刺攻防一体

    《2xko》今日发布了亚索的实机演示预告,这款由radiant entertainment携手拳头游戏共同打造的2v2对战格斗新作再度引发玩家关注。 实机预告片: 在本作中,亚索将作为可操作角色登场。这位以迅捷剑术著称的战士,不仅能施展流畅连击,还可借助风之力改变战场局势,展现出极具观赏性的战斗风格…

    2026年9月27日 • 用户投稿
    100
  • sublime怎么撤销刚刚关闭的标签页_sublime关闭标签页恢复方法

    sublime怎么撤销刚刚关闭的标签页_sublime关闭标签页恢复方法sublime怎么撤销刚刚关闭的标签页_sublime关闭标签页恢复方法sublime怎么撤销刚刚关闭的标签页_sublime关闭标签页恢复方法sublime怎么撤销刚刚关闭的标签页_sublime关闭标签页恢复方法

    可通过菜单或自定义快捷键恢复关闭的标签页。首先点击File→Reopen Closed Tab,或设置Ctrl+Shift+T(Windows/Linux)/Cmd+Shift+T(macOS)快捷键执行reopen_last_closed_file命令,但仅能恢复最后一次关闭的文件,且新关闭操作会…

    2026年9月27日 • 用户投稿
    100
  • Java 中的异常体系结构是怎样的?Error和Exception有什么区别?

    Java 中的异常体系结构是怎样的?Error和Exception有什么区别?Java 中的异常体系结构是怎样的?Error和Exception有什么区别?Java 中的异常体系结构是怎样的?Error和Exception有什么区别?Java 中的异常体系结构是怎样的?Error和Exception有什么区别?

    Java异常体系以Throwable为根,分为Error和Exception:Error表示JVM无法恢复的严重问题,如OutOfMemoryError,通常不捕获;Exception表示可处理的异常,又分受检异常(如IOException,编译器强制处理)和非受检异常(如NullPointerEx…

    2026年9月27日 • 用户投稿
    200
  • 360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口

    360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口360极速浏览器手机版怎么扫描二维码_移动版扫一扫功能使用入口

    360极速浏览器手机版可通过搜索框二维码图标或底部工具栏“更多”按钮进入扫一扫功能,授权相机后对准二维码即可快速识别并跳转页面。 如果您需要在手机上快速扫描二维码以访问链接或获取信息,360极速浏览器手机版提供了便捷的扫一扫功能。以下是具体的操作方法和使用入口。 本文运行环境:小米14,Androi…

    2026年9月27日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信