前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【点滴】在 promise 中 then 和 finally 有什么区别

【点滴】在 promise 中 then 和 finally 有什么区别

作者头像
疯狂的技术宅
发布于 2021-03-31 16:29:06
发布于 2021-03-31 16:29:06
2.6K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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() 抛出,你最终会处于相同的情形之下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 状态等)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
Callable/Future 和 Thread 之类的线程构建最大的区别在于,能够很方便的获取线程执行完以后的结果。首先来看一个简单的例子
源码之路
2020/09/04
5K0
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
Java线程(七):Callable和Future
本文介绍了Java线程的Callable和Future,包括如何使用Callable创建有返回值的线程,以及如何使用Future获取返回值。同时介绍了ExecutorService、Future和CompletionService等工具类,用于简化线程并发编程。
高爽
2017/12/28
5710
Runnable和Callable源码及应用解析
里面使用Runnable的地方只有传递对象的时候,其他都是使用的Thread而Thread又实现了我们的Runnable,所以Runbale可以理解为执行代码的对象,执行的过程和线程的操作交由Thread控制,Thread源码可以看 ----》Thread源码解析。
余生大大
2022/11/02
1990
Runnable和Callable源码及应用解析
6.实现 Callable 接口
6.实现 Callable 接口 前言 本篇章来介绍一下创建线程的第三种方式,其中创建线程一共有四种方式: 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式 那么下面我们来介绍一下 实现 Callable 接口的方式。 Callable 接口 - Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口 - Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程
Devops海洋的渔夫
2022/03/23
5980
6.实现 Callable 接口
Thread, Runable, Callable 还傻傻分不清?
在java中你怎么创建线程?相信你很快能够想到继承Thread类和实现Runnable接口这两种方式。
Java技术栈
2020/12/21
7600
Thread, Runable, Callable 还傻傻分不清?
Runnable 和Callable的实现与区别,应用场景
1:通过实现Runnable接口 2:通过继承Thread接口 3:通过Callable和Future创建线程
全栈程序员站长
2022/07/25
1.5K0
Java并发之Executor + Callable + Future引入 Callable + FutureCallable + Future实例
Executor框架的优势之一就是,可以运行并发任务并且返回结果。 我们知道Runnable对象是没有返回值的,所以自然利用Runnable对象就无法返回结果,于是就定义了一个新的接口,可以理解为是“带有返回值的Runnable对象”。 这个接口就是 Callable接口:这个接口声明了一个call方法,类似于Runnable接口的run方法,是任务具体的逻辑,不同就在于可以有返回值,而且这个接口是一个泛型接口,这就意味着必须声明call方法的返回类型。
desperate633
2018/08/22
3110
Java并发之Executor + Callable + Future引入 Callable + FutureCallable + Future实例
创建线程都有哪些方式?— Callable篇
相信大家回答这个问题没什么难度吧?通常问完创建方式,那么接下来就是问「1、2」跟「3」创建方式的不同了,只要说出「3」有返回值基本这个问题就过了,不管是出于好奇还是疑惑,我们今天来会会这个Callable。
niceyoo
2020/07/26
8010
Callable与Future介绍
在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。
HLee
2021/10/13
1K0
Callable与Future介绍
Future和Callable学习
我们知道使用多线程时,最初的Thread到线程池,此时对于线程的使用,提供了其使用的复用率。而实现多线程的三种方式:继承Thread;实现Runnable接口,重写run方法;实现Callable接口,同时重写call方法,同时通过Future获取执行的返回值。也就是说callable执行任务,而Future拿到执行的结果。Future具有阻塞性在于其get()方法具有阻塞性,而isDone()是不具有阻塞性的。
路行的亚洲
2020/07/16
5030
刚研究完Callable和Future,各位随便问!!
在Java的多线程编程中,除了Thread类和Runnable接口外,不得不说的就是Callable接口Future接口了。使用继承Thread类或者实现Runnable接口的线程,无法返回最终的执行结果数据,只能等待线程执行完成。此时,如果想要获取线程执行后的返回结果,那么,Callable和Future就派上用场了。
冰河
2021/04/30
6770
并发编程系列之Callable和Runnable的不同?
并发编程系列之Callable和Runnable的不同?在学习并发多线程的过程中,很多读者都知道怎么实现Runnable,下面是一道经典的例子
SmileNicky
2021/09/08
4131
并发编程系列之Callable和Runnable的不同?
Java并发编程之Future和FutureTask
搞过Java或者客户端Android开发的都知道,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。不过,这2种方式都有一个缺陷,就是在执行完任务之后无法获取执行结果。
xiangzhihong
2022/11/30
3680
Java中的Runnable、Callable、Future、FutureTask的区别
Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。
开发者技术前线
2020/11/23
4620
Future && FutureTask
线程的创建方式中有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,于是就有了Callable接口,Future接口与FutureTask类的配和取得返回的结果。
大学里的混子
2019/03/13
5520
java 多线程
就绪,当线程调用了strat()方法的时候,线程就绪,会为其创建方法调用栈和程序计数器。
mySoul
2018/11/19
8100
简单理解Callable接口
Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解
彼岸舞
2020/11/06
8630
Future解析与使用
Java 1.5开始,提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
林老师带你学编程
2019/05/25
5890
多线程(四) | 聊聊Callable和Future
通过前面几篇文章,我相信大家应该对于如何使用多线程执行任务应该都有了一定的了解。今天我们来讲一讲Callable和Future。
一缕82年的清风
2022/11/02
5570
Future FutrueTask Callable类源码说明以及原理使用
  JDK内置的Future主要使用到了Callable接口和FutureTask类。
小勇DW3
2018/08/30
5620
相关推荐
Callable/Future 使用及原理分析,Future .get()为啥能等待呢?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档