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

在微任务队列中,当我们返回值和从then()链返回Promise.resolve时会发生什么?

在微任务队列中,当我们返回值和从then()链返回Promise.resolve时,会发生以下情况:

  1. 返回值:如果在Promise的resolve或reject回调函数中返回一个非Promise的值,那么这个值会被包装成一个已解决(resolved)的Promise,并作为下一个then()方法的参数传递。这样可以实现链式调用,将返回值传递给后续的Promise。
  2. Promise.resolve():当我们从then()链中返回一个Promise.resolve()时,它会创建一个已解决(resolved)的Promise,并将其作为下一个then()方法的参数传递。这样可以在Promise链中插入一个新的Promise,以便在后续的then()方法中处理。

总结起来,无论是返回值还是Promise.resolve(),它们都会将结果包装成一个已解决(resolved)的Promise,并将其传递给下一个then()方法。这样可以确保Promise链的顺序执行,并将结果传递给后续的处理函数。

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

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云开发(CloudBase):https://cloud.tencent.com/product/tcb
  • 云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 区块链(Blockchain):https://cloud.tencent.com/product/baas
  • 元宇宙(Metaverse):https://cloud.tencent.com/product/metaspace
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

我们看下当我们终端运行这段代码时会发生什么? 非常酷!就像我们所期望的一样,promise 得到了解析数据后的值。 但是现在呢?我们不关心整个 promise 对象,我们只关心数据的值!...然而,事件循环内部,实际上有 2 种类型的队列:宏任务(macro)队列 (或者只是叫做 任务队列 ) 任务队列。 (宏)任务队列用于 宏任务任务队列用于 任务。...它们返回值的时候,会被栈内弹出。 调用栈是空的时,所有排队的任务会一个接一个任务任务队列中弹出进入调用栈,然后调用栈中被执行!...(任务自己也能返回一个新的任务,有效地创建无限的任务循环 ) 如果调用栈任务队列都是空的,事件循环会检查宏任务队列里是否还有任务。...一旦任务中所有的任务被放入调用栈并且最终被弹出,JavaScript 引擎会检查宏任务队列任务,将他们弹入调用栈并且它们返回值的时候把它们弹出调用栈。

2K10

【JS】779- 深入理解Promise

执行 resolve()/reject() 的时候,会将 Promise 对应的处理程序推入微任务队列,稍等这里提到的对应的处理程序具体是指什么?...我们知道 onResolved 函数会基于返回值生成一个新的 Promise,而 onResolvedA 函数没有显示的返回值,所以其返回值为 undefined,那么经过 Promise.resolve...3; 开始执行任务队列 2 里的内容,打印 B,同上一条原理,由于 onResolvedB 函数的返回值为 undefined,所以生成了一个 resolved 的新实例,则会立即将 onResolvedC...推入微任务队列 4; 执行任务队列 3,打印 D; 执行任务队列 4,打印 C; 至此全部代码执行完成,最终的打印结果为:A B D C。...将函数返回值 3 转成一个 Promise {: 3} 的新实例,这是第二个状态发生变化的实例; 此时所有迭代对象遍历完成,即同步代码执行完成,开始执行任务队列 1 的内容,打印

1K10

「硬核JS」图解Promise迷惑行为|运行机制补充

原因搞清楚了,我们开始改造。我们可以执行then方法时如果还在等待态 pending,就把回调函数临时寄存到队列(就是一个数组)里,状态发生改变时依次数组取出执行就好了。...现在程序运行状态如下: 继续执行任务队列的方法 P2-t1 执行,输出 10,返回值是 undefined ,这时会调用 P2-t1 这个 then 方法返回的新 Promise 实例的 resolve...我们来看图: 接着开始执行后任务队列的 P2-t1 : P2-t1 回调执行,输出 10,返回值是 undefined ,这时会调用 P2-t1 这个 then 方法返回的新 Promise...如下图: 接着开始执行后任务队列的 P2-t1 : P2-t1 回调执行,输出 10,返回值是 undefined ,这时会调用 P2-t1 这个 then 方法返回的新 Promise 实例的...整个程序任务入队出队顺序如下: 至于为什么一个 then 不带 then 的输出结果一致,我们来看三个程序的任务入队出队顺序对比就知道了: 其实,主要是因为返回的 Promise 对象后写一个

2.2K30

前端面试题汇总-代码输出篇

遇到了定时器,将其加入宏任务队列; 3. 执行Promise p的resolve,状态变为resolved,返回值为1; 4....执行Promise first的resolve,状态变为resolved,返回值为2; 5. 遇到p.then,将其加入微任务队列,遇到first().then,将其加入任务队列; 6....这样第一轮宏任务就执行完了,开始执行任务队列任务,先后打印出12; 8....,我们知道.finally的返回值如果在没有抛出错误的情况下默认会是上一个Promise的返回值,而这道题中.finally上一个Promise是.then(),但是这个.then()并没有返回值,所以...执行宏任务的第一个定时器setTimeout,首先打印出2,然后遇到 Promise.resolve().then(),将其加入到任务队列; 8.

46420

Promise面试题_研究生英语面试常见问题及回答技巧

await后面的Promise是没有返回值的,也就是它的状态始终是pending状态,所以await之后的内容是不会执行的,也包括async1后面的 .then。...执行Promise p的resolve,状态变为resolved,返回值为1 执行Promise first的resolve,状态变为resolved,返回值为2 遇到p.then,将其加入微任务队列...,遇到first().then,将其加入任务队列 执行外面的代码,打印出4 这样第一轮宏任务就执行完了,开始执行任务队列任务,先后打印出12 这样任务就执行完了,开始执行下一轮宏任务,宏任务队列中有一个定时器...期望参数是一个函数,这里传入的是一个数字,因此就会发生值渗透,将resolve(1)的值传到最后一个then,直接打印出1 遇到第二个定时器,将其加入到任务队列,执行任务队列,按顺序依次执行两个定时器...,我们知道.finally的返回值如果在没有抛出错误的情况下默认会是上一个Promise的返回值,而这道题中.finally上一个Promise是.then(),但是这个.then()并没有返回值,所以

22330

前端经典面试题合集

分别存放到任务(立即存放)任务(时间到了或事情发生了才存放)到队列script执行完毕后,会清空所有的任务任务执行完毕后,会渲染页面(不是每次都调用)再去宏任务队列中看有没有到达时间的,拿出来其中一个执行执行完毕后...,往下执行new Promise立即执行,输出2,then的回调函数丢到任务队列,再继续执行,遇到process.nextTick,同样将回调函数扔到任务队列,再继续执行,输出5,所有同步任务执行完成后看有没有可以执行的任务...宏任务任务执行之后执行,因此同一个事件循环周期内,如果既存在任务队列又存在宏任务队列,那么优先将任务队列清空,再执行宏任务队列我们可以看到有一个核心的主线程,它的执行阶段主要处理三个核心逻辑。...将异步任务插入到任务队列或者宏任务队列。执行任务或者宏任务的回调函数。主线程处理回调函数的同时,也需要判断是否插入微任务任务。...,这两个函数我们之前的内容没有讲过,但是当你开始考虑它们 Eventloop 的生命周期的哪一步触发,或者这两个方法的回调会在任务队列还是宏任务队列执行的时候,才发现好像没有想象那么简单。

85820

JS 异步

如果同步代码执行完,调用栈call stack为空,去查看任务队列,每执行完一个任务,它就会任务队列出队,直到任务队列空后,尝试DOM渲染(如果DOM结构发生变化)。...宏任务:DOM渲染后触发,如setTimeout 任务:DOM渲染前触发,如Promise 为什么任务渲染前,宏任务渲染后? - 任务:ES 语法标准之内,JS 引擎来统一处理。...,然后任务队列塞入promise1promise2 第一个setTimeout1执行完毕后,会去任务队列检查发现有两个promise,会把两个promise按顺序执行完 尝试DOM渲染 执行下一个宏任务...,两个promise执行完毕后会任务队列没有任务了,会去宏任务执行下一个任务 setTimeout2 setTimeout2 执行的时候,先打印一个timeout2,然后又在任务队列塞了一个...为什么这里有返回undefined之后才会打印setTimeout,因为前面是同步代码任务执行完了,JS引擎工作结束,开始返回值。后面打印的setTimeout是浏览器处理的。

3.4K20

如果才能做好准备好前端面试

执行同步代码时,如果遇到异步事件,js 引擎并不会一直等待其返回结果,而是会将这个事件挂起,继续执行执行栈的其他任务异步事件执行完毕后,再将异步事件对应的回调加入到一个任务队列中等待执行。...任务队列可以分为宏任务队列任务队列,当当前执行栈的事件执行完毕后,js 引擎首先会判断任务队列是否有任务可以执行,如果有就将任务队首的事件压入栈执行。...任务队列任务都执行完成后再去执行宏任务队列任务。...(2)重绘页面某些元素的样式发生变化,但是不会影响其文档流的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘。...__proto__时,可以理解成返回了 // Object.getPrototypeOf(obj) 总结: 1、一个对象查找属性方法时会自身查找,如果查找不到则会通过

44720

2年前端面试打怪升级之路

;遇到Promise,首先执行里面的同步代码,打印出2,遇到resolve,将其加入到任务队列,执行后面同步代码,打印出3;继续执行script的代码,打印出78,至此第一轮代码执行完成;执行任务队列的代码...,首先打印出4,如遇到Promise,执行其中的同步代码,打印出5,遇到定时器,将其加入到宏任务队列,此时宏任务队列中有两个定时器;执行宏任务队列的代码,这里我们需要注意是的第一个定时器的时间为100ms...如果 JS 是门多线程的语言话,我们多个线程处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程删除节点),当然可以引入读写锁解决这个问题。...不同的任务源会被分配到不同的 Task 队列任务源可以分为 任务(microtask) 任务(macrotask)。...poll 队列的事件并且 poll 没有定时器的情况下,会发现以下两件事情如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制如果 poll 队列为空,会有两件事发生如果有

24130

动图学JS异步: Promises & AsyncAwait

然而,事件循环中,实际上有两种类型的队列(宏)任务队列(macro)task queue(或者叫任务队列),以及任务队列microtask queue。...该(宏)任务队列是(宏)任务microtask队列是microtasks。 那么什么是宏任务队列什么任务队列?虽然实际上存在的比我下面列出来的多,但是在下面的表格中都是我们最常见的! ?...我们看到promise属于任务队列一个promise执行resolve方法后,然后调用它的then()、catch()、finally()方法,在这些方法的回调都将被添加到microtask queue...事件循环对于这些任务给出了不同的优先级。 1.所有函数都是在当前调用栈执行,它们返回一个值时候,就会调用栈弹出。...函数体的第一行,我们调用另一个的console.log,console.log被添加到调用堆栈,执行它,并且返回值In function!打印到控制台,并从调用堆栈弹出。 ?

1.1K20

Node 事件循环知多少

浏览器的事件循环 宏任务任务 事件循环中的异步队列有两种:宏任务( macro )队列任务( micro )队列。 宏任务队列有一个,任务队列只有一个。...同步代码执行完了,script 脚本会被移出宏任务队列,这个过程本质上是队列的宏任务的执行出队的过程。 上一步我们出队的是一个宏任务,这一步我们处理的是任务。...接下来是处理异步任务,异步任务分为宏任务队列任务队列执行宏任务队列的每个宏任务之前先把任务清空一遍,由于 promise 是任务,所以会先被执行,而 setTimeout 由于是一个宏任务...,会去查看是否有任务队列,上题中存在(有且只有一个),然后执行任务队列的所有任务输出 Promise1,同时会生成一个宏任务 setTimeout2。...执行宏任务 setTimeout1 时会生成任务 Promise2 ,放入微任务队列,接着先去清空任务队列的所有任务,输出 Promise2。

58910

js事件循环与macroµ任务队列-前端面试进阶_2023-05-19

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,等待同步任务执行完毕之后,轮询执行异步任务队列任务macrotask 即宏任务,宏任务队列等同于我们常说的任务队列,macrotask...Promise的状态改变时会调用then函数定义的回调函数。我们都知道这个回调函数不会立刻执行,他是一个任务会被添加到当前任务队列的末尾,在下一轮任务开始执行之前执行。...但 await 下面的语句会被当成任务添加到当前任务队列的末尾异步执行。我们来看一下答案不记得题的!...的参数为 promise 对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。

28920

js事件循环与macroµ任务队列

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,等待同步任务执行完毕之后,轮询执行异步任务队列任务macrotask 即宏任务,宏任务队列等同于我们常说的任务队列,macrotask...Promise的状态改变时会调用then函数定义的回调函数。我们都知道这个回调函数不会立刻执行,他是一个任务会被添加到当前任务队列的末尾,在下一轮任务开始执行之前执行。...但 await 下面的语句会被当成任务添加到当前任务队列的末尾异步执行。我们来看一下答案不记得题的!...的参数为 promise 对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。

51720

js事件循环与macroµ任务队列-前端面试进阶

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,等待同步任务执行完毕之后,轮询执行异步任务队列任务macrotask 即宏任务,宏任务队列等同于我们常说的任务队列,macrotask...Promise的状态改变时会调用then函数定义的回调函数。我们都知道这个回调函数不会立刻执行,他是一个任务会被添加到当前任务队列的末尾,在下一轮任务开始执行之前执行。...但 await 下面的语句会被当成任务添加到当前任务队列的末尾异步执行。我们来看一下答案不记得题的!...的参数为 promise 对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。

35720

js事件循环与macroµ任务队列-前端面试进阶

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,等待同步任务执行完毕之后,轮询执行异步任务队列任务macrotask 即宏任务,宏任务队列等同于我们常说的任务队列,macrotask...Promise的状态改变时会调用then函数定义的回调函数。我们都知道这个回调函数不会立刻执行,他是一个任务会被添加到当前任务队列的末尾,在下一轮任务开始执行之前执行。...但 await 下面的语句会被当成任务添加到当前任务队列的末尾异步执行。我们来看一下答案不记得题的!...的参数为 promise 对象时直接返回这个 Promise 对象,then 函数在这个 Promise 对象发生改变后立刻执行。...我们知道Promise.resolve()的参数为Promise对象时,会直接返回这个Promise对象。

39720

2023我的前端面试小结3

如果 JS 是门多线程的语言话,我们多个线程处理 DOM 就可能会发生问题(一个线程中新加节点,另一个线程删除节点),当然可以引入读写锁解决这个问题。...不同的任务源会被分配到不同的 Task 队列任务源可以分为 任务(microtask) 任务(macrotask)。...poll 队列的事件并且 poll 没有定时器的情况下,会发现以下两件事情如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制如果 poll 队列为空,会有两件事发生如果有...异步指的是一个进程执行某个请求时,如果这个请求需要等待一段时间才能返回,这个时候进程会继续往下执行,不会阻塞等待消息的返回消息返回时系统再通知进程进行处理。...先执行 Script 脚本,然后清空任务队列,然后开始下一轮事件循环,继续先执行宏任务,再清空任务队列,如此往复。

49540

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

并将返回值作为Promise.race()方法产生的Promise实例的返回值8、Promise.resolve()将现有对象转为Promise对象,如果该方法的参数为一个Promise对象,Promise.resolve...__proto__时,可以理解成返回了 // Object.getPrototypeOf(obj) 总结: 1、一个对象查找属性方法时会自身查找,如果查找不到则会通过...先执行 Script 脚本,然后清空任务队列,然后开始下一轮事件循环,继续先执行宏任务,再清空任务队列,如此往复。...setTimeout setInterval 等都是任务源,真正进入任务队列的是他们分发的任务。...(2)重绘页面某些元素的样式发生变化,但是不会影响其文档流的位置时,浏览器就会对元素进行重新绘制,这个过程就是重绘。

52620

社招前端必会面试题(附答案)

await后面的Promise是没有返回值的,也就是它的状态始终是pending状态,所以await之后的内容是不会执行的,包括async1后面的 .then。...;遇到Promise,执行代码,打印出3,遇到resolve,将其加入到任务队列;遇到第二个定时器,加入到宏任务队列;遇到第三个定时器,加入到宏任务队列;继续执行script代码,打印出8,第一轮执行结束...;执行任务队列,打印出第一个Promise的resolve结果:4;开始执行宏任务队列,执行第一个定时器,打印出2;此时没有任务,继续执行宏任务的第二个定时器,首先打印出5,遇到Promise,首选打印出...6,遇到resolve,将其加入到任务队列;执行任务队列,打印出6;执行宏任务队列的最后一个定时器,打印出7。...true 会发生什么情况?

33830

【JavaScript】 事件循环 —— 任务 Microtask

JavaScript 引擎执行完当前的代码,它会队列获取任务并执行它。 这就是为什么在上面那个示例 "code finished" 会先显示。...如果我们并不了解任务队列我们可能会想:“为什么 unhandledrejection 处理程序(handler)会运行?我们已经捕获(catch)并处理了 error!”...但是现在我们知道了,任务队列任务都完成时,才会生成 unhandledrejection:引擎会检查 promise,如果 promise 的任意一个出现 "rejected" 状态,unhandledrejection...大多数 JavaScript 引擎(包括浏览器 Node.js),任务(microtask)的概念与“事件循环(event loop)”“宏任务(macrotasks)”紧密相关。...由于这些概念跟 promise 没有直接关系,所以我们将在 图解 JavaScript 事件循环:任务任务 一文对它们进行介绍。

45310
领券