首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我们在Promise解析之前调用.then时,到底会发生什么?

当我们在Promise解析之前调用.then时,会发生以下情况:

  1. Promise状态为pending:如果Promise的状态仍然是pending(即未解析),则调用.then方法会将回调函数添加到Promise的回调队列中,等待Promise解析后执行。
  2. Promise状态为fulfilled:如果Promise的状态已经是fulfilled(即已解析),则调用.then方法会立即执行回调函数,并将Promise解析值作为参数传递给回调函数。
  3. Promise状态为rejected:如果Promise的状态已经是rejected(即已拒绝),则调用.then方法会立即执行回调函数,并将Promise拒绝原因作为参数传递给回调函数。

总结起来,当我们在Promise解析之前调用.then时,如果Promise的状态是pending,回调函数会被添加到回调队列中,等待Promise解析后执行;如果Promise的状态已经是fulfilled或rejected,回调函数会立即执行。这样可以确保无论Promise的状态如何,都能正确处理回调函数的执行。

腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能开放平台(AI):https://cloud.tencent.com/product/ai
相关搜索:当您不能使用unbind()时,到底会发生什么?当我们在rxjava中使用观察者时,到底会发生什么?在解析promise之前运行多个ajax调用在asyncTask中工作时,当同步的块无法获取密钥时,到底会发生什么?当浏览器不支持功能查询时,到底会发生什么?仅当xhr.onloadend之前已触发时才解析promise在Node中等待解析promise时会发生什么当联合父rdd和子rdd在操作之前发生时会发生什么?为什么在解析服务调用之前呈现模板当调用应用程序关闭时,线程会发生什么情况?当我在for循环中调用setTimeout时发生了什么?尽管使用了done,但Mocha在挂钩之前调用async promise chain时超时为什么在两次调用promise时RSVP延迟会产生错误当我们不使用任何参数(在React钩子中)时,会发生什么情况?在微任务队列中,当我们返回值和从then()链返回Promise.resolve时会发生什么?当您在Windows命令shell中移动文件时,在目录级别会发生什么?为什么我在将DataSource传递给BindingSource之前对它调用.OrderBy时,它的类型似乎发生了变化?当页面在颤动中加载时,哪个函数会在所有函数之前被调用?当我们在Django中传递命令python manage.py createsuperuser时,后台会发生什么?在调用` field ResolveField`之前,Apollo GraphQL会先解析该字段。字段“resolve”实际上是如何发生的,又在哪里发生?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript 编程精解 中文第三版 十一、异步编程

但是,我们希望单个程序等待网络请求能做一些事情,这并没有什么帮助。 异步 同步编程模型中,一次只发生一件事。 当你调用执行长时间操作的函数,它只会在操作完成返回,并且可以返回结果。...它注册了一个回调函数,Promise解析并产生一个值调用。 你可以将多个回调添加到单个Promise中,即使Promise解析(完成)后添加它们,它们也会被调用。...只有操作成功,才会调用解析处理器(使用then注册),并且拒绝会自动传播给由then返回的新Promise一个处理器抛出一个异常,这会自动使then调用产生的Promise被拒绝。...但是那些匹配的对象被调用,并且它们的结果决定了下一次会出现什么样的值 – 返回非Promise成功,它抛出异常拒绝,并且它返回其中一个Promise的结果。...如果我从一个函数中调用setTimeout,那么调用回调函数该函数已经返回。 回调返回,控制权不会回到调度它的函数。 异步行为发生在它自己的空函数调用堆栈上。

2.6K20
  • JavaScript 引擎是如何实现 asyncawait 的

    不过,对于上面这段代码,你可能又有这样疑问:父协程有自己的调用栈,gen 协程也有自己的调用栈, gen 协程通过 yield 把控制权交给父协程,V8 是如何切换到父协程的调用栈?...父协程通过 gen.next 恢复 gen 协程,又是如何切换 gen 协程的调用栈? 要搞清楚上面的问题,你需要关注以下两点内容。...这得先来分析 async 结合 await 到底会发生什么详细介绍之前我们先站在协程的视角来看看这段代码的整体执行流程图: 结合上图,我们来一起分析下 async/await 的执行流程。...接下来就执行到 foo 函数中的await 100这个语句了,这里是我们分析的重点,因为执行await 100这个语句,JavaScript 引擎背后为我们默默做了太多的事情,那么下面我们就把这个语句拆开...执行到await 100,会默认创建一个 Promise 对象,代码如下所示 let promise_ = new Promise((resolve,reject){ resolve(100)

    1K30

    惊艳!可视化的 js:动态图演示 Promises & AsyncAwait 的过程!

    如果图片被加载完成并且一切正常,让我们用加载完的图片解决 (resolve)promise。 否则,如果在加载文件某个地方有一个错误,我们将会用发生的错误拒绝 (reject)promise 。...让我们看下当我们终端运行这段代码时会发生什么? 非常酷!就像我们所期望的一样,promise 得到了解析数据后的值。 但是现在呢?我们不关心整个 promise 对象,我们只关心数据的值!...最前一行输出! 然而,第二个被打印的值是 End!,并不是 promise 被解决的值!只有 End! 被打印之后,promise 的值才会被打印。 这里发生什么?...它们返回值的时候,会被从栈内弹出。 调用栈是空的,所有排队的微任务会一个接一个从微任务任务队列中弹出进入调用栈中,然后调用栈中被执行!...这样,我们就可以暂停一个异步函数吗?很好,但这到底是什么意思? 当我们运行下面的代码块我们看下发生什么: 额,这里发生什么呢? 首先,JavaScript 引擎遇到了 console.log。

    2.1K10

    web前端如何准备面试工作??

    解析到脚本元素,浏览器就会停止从 HTML 构建 DOM,并开始执行 JavaScript 代码。为了避免解析 JavaScript 代码花费太长时间,而阻塞页面渲染。...执行上下文也分两种 全局执行上下文和函数执行上下文; JavaScript 程序开始执行时就已经创建了全局上下文;而函数执行上下文是每次调用函数,就会创建一个新的 页面构建完了之后变进入第二个阶段...new 搭配,它们产生对象,直接调用时,它们表示强制类型转换。...我们在给函数传参数的时候,除了有我们显示传入的实参之外,其实还包含了两个隐士参数 this 和 arguments。this 表示被调用函数的上下文(什么环境下调用,就指向什么)。...JSON字符串发生了异常,则对该promise执行reject方法” } } request.onerror=function(){//“如果和服务器端通信过程中发生了错误

    62510

    动图学JS异步: Promises & AsyncAwait

    好了,那么现在我们知道如何更好的控制Promise对象了,但是它实际上有什么作用呢? 之前我们讲述了一个关于对图像处理的代码示例,最终得到的是一个回调地狱般的xx代码。...如果图像加载一切正常,那么我们就resolve这个promise,如果在加载文件发生错误,那么我们就reject它。 ? 接下来我们终端执行上述代码看看会发生什么? ? Cool!...promise我们所预期的那样正常返回了图像相关的解析数据。 但是接下来怎么办呢?...于是它被弹出到调用堆栈后,由于它会记录promise之前resolve()中的值,因此打印出Promise!控制台并且从调用堆栈弹出。 ?...让我们看看当我们运行下面的代码块会发生什么: ? 嗯..这里发生什么? ? 首先,JS引擎执行到console.log。它被弹出到调用堆栈,然后执行,打印结果Before function!

    1.1K20

    JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 asyncawait 更好地编码方式!

    发布的第一篇文章中,思考了这样一个问题:调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器中运行一个复杂的图像转换算法。...这样的迭代事件循环中称为(tick)标记,每个事件只是一个函数回调。 ? 让我们“执行”这段代码,看看会发生什么: 1.初始化状态都为空,浏览器控制台是空的的,调用堆栈也是空的 ?... sum(…) 操作完成,sum 传入的两个 Promise 都执行完后,可以打印出来了。这里隐藏了sum(…)中等待x和y未来值的逻辑。...此外,虽然没有第二个 Promise 结束调用 then方法 ,其时这里也创建一个 Promise。...调用使用 async 声明函数,它返回一个 Promise这个函数返回一个值,这个值只是一个普通值而已,这个函数内部将自动创建一个承诺,并使用函数返回的值进行解析

    3.1K20

    前端魔法堂——异常不仅仅是trycatch

    事件,什么调用栈和如何获取调用栈的相关信息。  ...ReferenceError,引用未声明的变量发生 SyntaxError,解析发生语法错误 TypeError,当值不是所期待的类型,null.f()也报这个错 URIError,传递一个非法的...解答上述疑问前,我们先偏离一下,稍微挖挖throw语句的特性。 throw后面可以跟什么啊?  ...每个可能发生异常的地方都写上try/catch显然是不实际的(另外还存在性能问题),即使是罗嗦如Java我们开发也就是不断声明throws,然后顶层处理异常罢了。...Promise实例的初始化状态是pending,而发生异常则为rejected,而导致状态从pending转变为rejected的操作有 调用Promise.reject类方法 工厂方法中调用reject

    1.5K70

    前端魔法堂——异常不仅仅是trycatch

    事件,什么调用栈和如何获取调用栈的相关信息。  ...ReferenceError,引用未声明的变量发生 SyntaxError,解析发生语法错误 TypeError,当值不是所期待的类型,null.f()也报这个错 URIError,传递一个非法的...解答上述疑问前,我们先偏离一下,稍微挖挖throw语句的特性。 throw后面可以跟什么啊?  ...每个可能发生异常的地方都写上try/catch显然是不实际的(另外还存在性能问题),即使是罗嗦如Java我们开发也就是不断声明throws,然后顶层处理异常罢了。...Promise实例的初始化状态是pending,而发生异常则为rejected,而导致状态从pending转变为rejected的操作有 调用Promise.reject类方法 工厂方法中调用reject

    1.1K30

    node爬虫入门

    ,上面代码可能导致同一间有200个异步请求执行,这样可能导致程序因为内存不足崩溃,因此我们这里需要控制一下并行的请求数,代码如下(这里可以跳过,他不影响爬虫入门学习,只是需要知道后面的写法是用来控制并发量的...,返回一个Promise实例 .then(result => console.log(result)); // 这里就是所有请求所有页面的响应体对象 解析并读取html文档 我们可以通过正则来读取前面响应体中我们想要的内容...因为这块是js浏览器运行时动态添加到网页中的内容,因此,我们请求首页返回的数据并没有这里的数据。...当然我们还有其他的方案,就是network中观察这些列表与什么接口有关,然后使用node直接请求这些接口,这样速度会快很多,当然就需要自己去观察了。...当然也可以实例Crawler对象的时候传入callback函数,解析成功后就会直接调用这个回调。

    5.3K20

    两个try catch引起的对JS事件循环的思考

    setTimeout里的错误被异步抛出的,我们也就这么记下了,具体发生什么咱也不知道。...: 调用fetch,会返回一个Promise对象 fetch的主要业务流程都在executor函数中执行了 如果excutor函数中的业务执行成功了,会调用resolve函数;否则调用reject...excutor函数中调用resolve函数,触发promise.then设置的回调函数;而调用reject函数,触发promise.catch设置的回调函数。...这得先来分析async结合await到底会发生什么。 首先,执行console.log(0)这个语句,打印出来0。...执行到await 100,会默认创建一个Promise对象,代码如下所示: const promise_ = new Promise((resolve,reject){ resolve(100

    1.1K10

    ES6知识点补充

    这里满足if的条件,进入true的逻辑,这里因为使用了let声明了变量name,一开始就"劫持了这个作用域",使得任何在let声明之前使用name的操作都会报错 使用var声明的变量,因为会有变量提升...=> reject,即一个Promise实例从pending状态改变后,就不会再改变了(不存在resolve => reject 或 reject => resolve) 而Promise实例必须主动调用...3、第三方库可能没有提供错误处理 Promise的then方法会接受2个函数,第一个函数是这个Promise实例被resolve执行的回调,第二个函数是这个Promise实例被reject执行的回调...传入的参数为undefined才使用函数的默认值(显式传入undefined也会触发使用函数默认值,传入null则不会触发) 举个例子: ?...调用拦截后的函数: ? handler.contruct contruct可以拦截通过new关键字调用这个函数的操作,我们可以把它用在单例模式中 ?

    1.1K50

    10分钟了解JavaScript AsyncAwait

    2、调用异步函数,请使用其主体中返回的内容进行解析。 3、异步函数允许使用await。 Await - 暂停异步函数的执行。...1、置于Promise调用前面,wait强制其余代码等待,直到该Promise完成并返回结果。 2、Await仅适用于Promises,它不适用于回调。...由于我们一次只进行一次调用,整个功能从开始到结束需要9秒(2 + 4 + 3)。 这不是最佳解决方案,因为三个变量A,B和C不相互依赖。换句话说,我们得到B之前我们不需要知道A的值。...我们可以同时得到它们并且等待几秒钟。 要同时发送所有请求,需要Promise.all()。这将确保执行后面函数之前我们仍然拥有所有结果,但异步调用将并行触发,而不是一个接一个地触发。...如果情况需要,我们还可以执行异步函数捕获错误。因为所有异步函数都返回Promise,所以调用它们我们可以简单地包含一个.catch()事件处理程序。

    3.5K41

    JavaScript 权威指南第七版(GPT 重译)(五)

    事件驱动的 JavaScript 程序指定的上下文中为指定类型的事件注册回调函数,指定的事件发生,Web 浏览器会调用这些函数。... HTTP 响应到达,该响应的主体被解析为 JSON,并将解析后的值传递给我们传递给then()的函数。...但因为我们从未对 promise 3 做任何操作,Promise 完成什么也不会发生,异步计算链在这一点结束。...p“解析”意味着它的命运现在完全取决于 Promisev的发生。 让我们回到我们的 URL 获取示例。c1返回p4,p2被解析。但被解析并不意味着被实现,所以任务 3 还没有开始。...对象,并且第一个 Promise 解析之前可能会多次调用next()。

    24110

    关于 JavaScript 中的 Promise

    一个待定的 Promise 最终状态可以是已兑现并返回一个值,或者是已拒绝并返回一个原因(错误)。其中任意一种情况发生,通过 Promise 的 then 方法串联的处理程序将被调用。...异步操作成功我们调用resolve函数,并传递一个成功的消息;异步操作失败我们调用reject函数,并传递一个失败的消息。...如果Promise对象执行过程中被成功解析(resolved),第一个回调函数将被调用,并传递解析值作为参数。...我们使用 Promise.race() 来让它们竞速,如果 cancellationPromise asyncOperation 之前完成,那么就会执行取消操作。...所有 Promise 都成功解决,.then() 方法将被调用,接收一个包含所有结果的数组;如果任何一个 Promise 被拒绝,.catch() 方法将被调用,接收拒绝的原因。

    66263

    重学JavaScript Promise API

    JavaScript中,一些操作是异步的。这意味着这些操作完成,它们产出的结果或者值并不会立即生效。 Promise是一个特殊的JavaScript对象,它代表了异步操作的最终结果。...回调函数 拥有JavaScript Promise之前,处理异步操作最优雅的方式是使用回调。异步操作的结果就绪,回调就是一个运行的函数。...从远程服务器收到成功的响应时,会传递给resolve方法。如果发生任何错误(无论是服务器上还是在网络层),reject方法将调用一个Error对象。...Promise的状态 在上面代码中,我们可以通过调用resolve和reject方法来改变Promise的状态。继续之前,花点时间看下Promise的生命周期。...catch方法 我们还可以使用catch方法,它可以为我们处理错误。一个PromisePromise链的任何地方rejected,控制会跳转到最近的拒绝处理函数中。

    14920

    20道前端高频面试题(附答案)

    待定状态的 Promise 对象执行的话,最后要么会通过一个值完成,要么会通过一个原因被拒绝。其中一种情况发生我们Promise 的 then 方法排列起来的相关处理程序就会被调用。...其中有一个失败方法,则进入失败方法我们来看下业务的场景,对于下面这个业务场景页面的加载,将多个请求合并到一起,用 all 来实现可能效果会更好,请看代码片段// 一个页面中需要加载获取轮播列表、获取店铺列表...错误发生,需修改请求的内容后再次发送请求。另外,浏览器会像 200 OK 一样对待该状态码。...调用 GPU 绘制,合成图层,显示屏幕上第四步和第五步是最耗时的部分,这两步合起来,就是我们通常所说的渲染具体如下图过程如下图所示图片图片渲染网页生成的时候,至少会渲染一次在用户访问的过程中,还会不断重新渲染重新渲染需要重复之前的第四步...,接下来我们看下html解析器碰到样式表会发生的情况js会阻塞解析,因为它会修改文档(document)。

    1K30

    【译】Promise、Observables和Streams之间的区别是什么

    Observable Promise 和 Observables 都能够帮助我们JavaScript 中使用异步功能。Promise 是以异步方式解析值,例如 HTTP 调用。...异步操作完成或失败,它只处理单个事件。 Observables 就像 Promise 一样,除了它与多个值一起工作,它会自行清理,它可以被取消。...一个 promise(生产者)向注册的回调(消费者)传递一个被解析后的值,但与函数不同的是,promise 负责精确确定何时将该值推送到回调。...我们订阅了一个 Observable,当下一个项目到达 onNext,或者流完成 onCompleted,或者发生错误 onError 我们会收到通知。...集合中的每个元素都是它实际成为该集合的一部分之前计算出来的。因此,它是一组急于被计算的值。 流是固定的数据结构,可以按需计算元素。

    1.3K20
    领券