Promise的一些关键问题


1. 如何修改promise的状态

  1. resolve(value):如果当前状态是pending,就会变为resolved
  2. reject(reason):如果当前状态是pending,就会变为rejected
  3. 抛出异常:如果当前状态是pending,就会变为rejected
    在这里插入图片描述
    在这里插入图片描述

2. 能否执行多个回调

一个promise对象指定多个成功/失败的回调函数,都会调用吗?
=> 指定回调用的就是then()方法,如果我们使用then()方法为一个promise对象指定多个回调,这些回调是不是都会执行?

  • promise对象改变为相应状态时都会调用
    在这里插入图片描述
    then()指定了两个成功的回调,当promise对象状态变为成功,这两个回调都会执行的
    在这里插入图片描述

3. 改变状态与指定回调的顺序问题

改变promise状态指定回调函数,谁先谁后?
⚠️:这里是指定回调函数,指定回调是执行then()方法,不是执行then()里的回调函数

  • 当执行器函数中的任务是一个同步任务,就是先改变状态,再去指定回调
    当执行器函数中的任务是一个异步任务,改变状态需要一定的时间,那就是先指定回调,再改变状态
  • 如何先改变状态再指定回调?
    • 在执行器中执行同步任务,直接调用resolve()/reject()
    • 延长更长时间才调用then()
  • 什么时候才能得到数据?(回调函数什么时候执行)
    • 如果先指定的回调,当状态发生改变时,回调函数就会调用,得到数据
    • 如果先改变的状态,当指定回调时,回调函数就会调用,得到数据

4. then()返回结果的状态由什么决定

then()执行后返回的结果是一个promise对象,那么这个新的promise对象的状态由什么决定?

  • then()指定的回调函数执行结果决定
    • 如果抛出异常, 新的promise对象变为rejectedreason为抛出的异常
    • 如果返回的是非promise的任意值,新的promise对象变为resolvedvalue为返回的值
    • 如果返回的是另一个新的promise,此promise的结果就会成为新的promise的结果

看以下例子:

  1. 情况1: 执行结果抛出异常
    这里的then()会执行的是成功的回调,那么then()返回的一个新的promise对象的状态就由这个成功的回调决定
    在这里插入图片描述
    这个成功的回调的执行结果抛出异常,就会将新promise的状态变为rejected
    在这里插入图片描述
    这个新promise的结果值就是抛出的错误,可以调用新promisethen()方法,通过reason拿到(因为它的状态是失败的)
    在这里插入图片描述
    在这里插入图片描述

  1. 情况2:执行结果返回非promise值
    这里的then()也是执行的是成功的回调,那么then()返回的一个新的promise对象的状态就由这个成功的回调决定
    在这里插入图片描述
    这个成功的回调的执行结果返回一个非promise值,就会将新promise的状态变为resolved
    在这里插入图片描述
    这个新promise的结果值就是返回的值,可以调用新promisethen()方法,通过value拿到(因为它的状态是成功的)
    在这里插入图片描述
    在这里插入图片描述

⚠️: 如果没有return的语句,相当于return undefined,和这种返回的是非promise的任意值情况相同


  1. 情况3:执行结果返回另一个promise对象
    这里的then()还是执行的是成功的回调,那么then()返回的一个新的promise对象的状态就由这个成功的回调决定
    在这里插入图片描述
    这个成功的回调的执行结果返回另一个promise对象,那么then()返回的promise的状态就取决于这个promise的状态,then()返回的promise的结果也就是这个promise的结果
    在这里插入图片描述

5. 如何串联多个操作任务?

promise如何串联多个操作任务?

  • promisethen()返回一个新的promise
  • 通过then()的链式调用串联多个同步/异步任务

在这里插入图片描述
第三个then()方法会输出的value值是undefined,这个值实际上要看调用第三个then()方法的promise对象的成功值,也就是看它的前一个then()方法。第二个then()方法指定的回调中没有return值,相当于return undefined,就是说返回了一个非promise值,像我们前面说的:那么第二个then()方法返回的promise是成功的promise,成功的结果就是它返回的结果undefined,这个成功值可以通过调用它的then()方法获得,也就是调用了第三个then()方法获得
在这里插入图片描述
解释有点绕,这样拆开来看:
在这里插入图片描述
在这里插入图片描述


6. 异常穿透

什么是promise的异常穿透?

  1. 当使用promisethen链式调用时,可以在最后指定失败的回调
  2. 前面任何操作出了异常,都会传到最后失败的回调用处理

最后用then()也可以,但是因为不需要指定成功的回调,所以catch()用得更多
在这里插入图片描述
成功的时候,没啥问题
在这里插入图片描述
失败的时候:
在这里插入图片描述
在这里插入图片描述
如果说前面有错误,不需要在前面处理错误,只要在最后放一个catch()就行,错误就由最后的catch()处理
在这里插入图片描述
在这里插入图片描述


7. 如何中断promise链

  1. 当使用promisethen链式调用时,在中间中断,不再调用后面的回调函数
  2. 方法:在回调函数中返回一个pending状态的promise对象

我们知道,then()执行后返回的结果是一个promise对象,这个新的promise对象的状态由then()指定的回调函数执行结果决定
也就是第一个then()这个时候只有返回一个pending状态的promise对象,才能使后面的then()中的回调不再调用
在这里插入图片描述


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目是什么以及为什么在面试中需要掌握Promise? 在面试中,关于Promise的面试题目可以涉及Promise的基本概念、使用方法和原理等方面的内容。例如,可以要求解析一段Promise的代码,或者要求描述Promise的执行顺序和特性等。通过这些面试题目,面试官可以了解面试者对Promise的理解程度和应用能力,进而评估其在异步编程方面的能力和经验。 面试中需要掌握Promise的原因主要有以下几点: 1. 异步编程是现代前端开发中非常重要的一部分,Promise是一种用于处理异步操作的机制,能够更好地处理回调地狱问题和提高代码的可读性。 2. Promise是JavaScript中的关键特性之一,在使用现代前端框架如React和Angular时,几乎无法避免使用Promise。因此,掌握Promise能够更好地理解和应用这些框架。 3. Promise是面试中常见的考点之一,掌握Promise能够更好地准备面试,展现自己的技术能力和经验。 综上所述,掌握Promise对于面试来说是非常重要的,它能够展示你对异步编程的理解和应用能力,并且能够提升你在面试中的竞争力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【异步系列三】10道 Promise 面试题彻底理解 Promise 异步执行顺序](https://blog.csdn.net/qq_41131745/article/details/127004662)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [10 个 JavaScript Promise 的面试题](https://blog.csdn.net/snsHL9db69ccu1aIKl9r/article/details/125454133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值