在 promise 中 then 和 finally 有什么区别

开发 前端
看上去 promise.prototype.then() 和 promise.prototype.finally 似乎非常相似。但是你需要明白它们有一些重要的差异。

看上去 promise.prototype.then() 和 promise.prototype.finally 似乎非常相似。但是你需要明白它们有一些重要的差异。

[[389960]]

第一个也最明显的是 finally() 没有得到 promise 链的结果。由于 finally() 没有收到值,因此无法更改 promise 的已解决值。

  1. new Promise((resolve, reject) => resolve(10)) 
  2.   .then(x => { 
  3.     console.log(x); // 10 
  4.     return x + 1; 
  5.   }) 
  6.   .finally(x => { 
  7.     console.log(x); // undefined 
  8.     return x + 2; 
  9.   }); 
  10. // Promise resolves to 11, the return value of then() 

另一个差异与错误处理以及如何解决 promise 链有关。有时,您可能想要推迟捕获 promise 链中的错误,从而允许你在其他地方处理。在这种情况下,promise 链的 then() 将不会被执行,而 finally() 会。并且如果上一个 catch() 抛出,你最终会处于相同的情形之下。

  1. new Promise((resolve, reject) => reject(0)) 
  2.   .catch(x => { 
  3.     console.log(x); // 0 
  4.     throw x; 
  5.   }) 
  6.   .then(x => { 
  7.     console.log(x); // 将不会执行 
  8.   }) 
  9.   .finally(() => { 
  10.     console.log('clean up'); // 'clean up' 
  11.   }); 
  12. // Uncaught (in promise) 0 

这里的重点是,除非有非常特殊的原因,否则不应该替换 then() 和 finally()。 根据经验,finally() 应该用于清理(清除超时,使引用为空,重置 UI 状态等)。

 

责任编辑:赵宁宁 来源: 前端先锋
相关推荐

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2022-08-31 08:33:54

Bash操作系统Linux

2022-09-02 09:02:44

TypeInterface

2020-03-09 20:56:19

LoRaLoRaWAN无线技术

2022-09-07 18:32:57

并发编程线程

2022-06-06 14:53:02

LoRaLoRaWAN

2020-11-09 14:07:53

PyQtQt编程

2022-09-08 18:38:26

LinuxWindowsmacOS

2020-08-02 23:20:36

JavaScriptmap()forEach()

2024-09-09 13:10:14

2022-08-02 08:23:37

SessionCookies

2022-02-27 15:33:22

安全CASBSASE

2021-12-17 14:40:02

while(1)for(;;)语言

2021-05-16 14:26:08

RPAIPACIO

2024-03-05 18:59:59

前端开发localhost

2024-05-27 00:40:00

2023-11-01 08:08:47

PythonIS运算符

2022-10-27 19:32:20

切片golang数组

2022-12-14 17:26:43

点赞
收藏

51CTO技术栈公众号