在 promise 中 then 和 finally 有什么区别
2023-03-09 22:14:06 时间
看上去 promise.prototype.then() 和 promise.prototype.finally 似乎非常相似。但是你需要明白它们有一些重要的差异。
第一个也最明显的是 finally() 没有得到 promise 链的结果。由于 finally() 没有收到值,因此无法更改 promise 的已解决值。
- new Promise((resolve, reject) => resolve(10))
- .then(x => {
- console.log(x); // 10
- return x + 1;
- })
- .finally(x => {
- console.log(x); // undefined
- return x + 2;
- });
- // Promise resolves to 11, the return value of then()
另一个差异与错误处理以及如何解决 promise 链有关。有时,您可能想要推迟捕获 promise 链中的错误,从而允许你在其他地方处理。在这种情况下,promise 链的 then() 将不会被执行,而 finally() 会。并且如果上一个 catch() 抛出,你最终会处于相同的情形之下。
- new Promise((resolve, reject) => reject(0))
- .catch(x => {
- console.log(x); // 0
- throw x;
- })
- .then(x => {
- console.log(x); // 将不会执行
- })
- .finally(() => {
- console.log('clean up'); // 'clean up'
- });
- // Uncaught (in promise) 0
这里的重点是,除非有非常特殊的原因,否则不应该替换 then() 和 finally()。 根据经验,finally() 应该用于清理(清除超时,使引用为空,重置 UI 状态等)。
相关文章
- 如何用上下文管理器扩展 Python 计时器
- 手把手教你实现一个 Python 计时器
- 在 VS Code 和 Codium 中编写 Python 程序
- 13 个非常有用的 Python 代码片段,建议收藏!
- 如何在 Python 中使用 DateTime
- 哪种Python循环方式最快?
- 速看!2022年6月编程语言排行榜出炉
- 一日一技:使用Python翻译HTML中的文本字符串
- 十个 Python 小技巧,覆盖了90%的数据分析需求!
- 如何打造一款极速数据湖分析引擎
- Python编程中特有的循环语句及其特点
- 熟悉事件循环?为什么会分为宏任务和微任务
- 封装几个有用的 Vue3 组合式API
- WireMock 让你轻松模拟API
- 聊聊 UseEffect 怎么支持Async...Await
- Python-master,实用Python脚本合集!
- 高考结束,用 Python 来分析下哪里的高考是地狱级难度
- Ahooks 中那些控制“时机”的 Hook 都是怎么实现的?
- 一日一技:如何让自己的工具函数在Python全局可用?
- 盘点八个数据分析相关的Python库(实例+代码)