当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于Promise执行顺序问题?

韦澄邈
2024-07-19
    Promise.resolve().then(res=>{
        console.log(1)
        return Promise.resolve()
    }).then(res=>{
        console.log(2)
    })
    Promise.resolve().then(res=>{
        console.log(3)
    }).then(res=>{
        console.log(4)
    }).then(res=>{
        console.log(5)
    }).then(res=>{
        console.log(6)
    })

    //打印
    // 1 
    // 3
    // 4
    // 5
    // 2
    // 6

打印2的位置 怎么解释呢

共有3个答案

杜彦君
2024-07-19

所有的问题都源自自己的不规范,什么好人会这么写

鲜于裕
2024-07-19
    Promise.resolve().then(res=>{
                    //^^^^ 它的返回值记为 promise_then
        console.log(1)
        return Promise.resolve()
             //^^^^^^^^^^^^^^^^^ 这个对象记为 promise_return
    }).then(res=>{
        console.log(2)
    })
    // 注意,promise_then 跟 promise_return 是两个不同的对象
   console.log(1) 入队
   -------------------
                             console.log(3) 入队
=========================================================
   console.log(1) 执行                               console.log(1)
   使用返回值 promise_return 去
   resolve promise_then。
   由于 promise_return 是一个
   promise ,于是入队一个任务
     调用 promise_return.then(),
     其回调为将 promise_then 设置
     为 fullfill
   ------------------------
                              console.log(3) 执行    console.log(3)
                              console.log(4) 入队
==========================================================
   promise_return.then() 执行
   由于 promise_return 已经
   fullfilled ,于是其回调作为
   一个任务入队:
     将 promise_return 置为
     fullfill
   -------------------------
                              console.log(4) 执行    console.log(4)
                              console.log(5) 入队
===========================================================
   promise_return 被设置为
   fullfilled,
   console.log(2) 入队
   --------------------------
                              console.log(5) 执行    console.log(5)
                              console.log(6) 入队
===========================================================
   console.log(2) 执行                               console.log(2)
   --------------------------
                              console.log(6) 执行    console.log(6)
逑彬炳
2024-07-19

执行 return Promise.resolve() 后,其他微任务都已经入栈了,然后这个promise才从pending到resolved状态,所以console.log(2)所在的回调函数最后入栈执行


实际用vscode调试发现和我的猜想不同

把问题的代码替换成相同效果的代码:

1    let p1
2    Promise.resolve()
3      .then(res => {
4        console.log(1)
5        return (p1 = new Promise((res, rej) => {
6          res()
7        }))
8      })
9      .then(res => {
10        console.log(2)
11      })
12    Promise.resolve()
13      .then(res => {
14        console.dir(p1)
15        console.log(3)
16      })
17      .then(res => {
18        console.log(4)
19      })
20      .then(res => {
21        console.log(5)
22      })
23      .then(res => {
24        console.log(6)
25      })

输出顺序和原代码一致:

1
Promise {[[PromiseState]]: 'fulfilled', [[PromiseResult]]: undefined, Symbol(async_id_symbol): 15, Symbol(trigger_async_id_symbol): 6}
3
4
5
2
6

在单步调试的时候,发现按行数的执行顺序实际是:

  2
  3
  12
  13
  4
  5 // return 执行
  6 // return的promise的resolve执行
  9 // console.log(2)所在的then执行
  14 // console.dir(p1),并且这时候p1就已经是fulfilled的状态了
  15 // console.log(3)
  17 // console.log(4)的then
  18 // console.log(4)
  20 // console.log(5)的then
  21 // console.log(5)
  10
  23
  24

令我没想到的是,return的promise没有在console.log(4)和console.log(5)的then执行后才resolve,相反,是先resolve然后console.log(2)的then都执行了才轮到4、5的then执行。看来then的执行和进入任务队列的先后没有必然关系,之前的回答还是从结果出发去猜过程,等我找找相关的资料再重新审视这个问题

 类似资料:
  • 关于 promise reduce执行顺序 请高手解释下为何p1和p2为什么都是打印1,p1和p2都在runPromiseInSequence之前执行 这是我尝试修改后的代码, 看起来还是比较吃力,求大佬帮我解析一下,问了chatgpt回答的不正确

  • Demo 从日志输出来看 先执行了p1后执行p2, 问题 1.Promise.all的参数接受一个Promise数组, Promise数组中每一个Promise的执行函数的 开始执行顺序是怎样的? 是按照数组中的顺序 开始执行每一个Promise的执行函数吗?从实际日志输出来看 好像是数组的倒序 (注意问题问题的是Promise的执行函数的 开始执行顺序,并不是Promise的完成顺序,仅仅是执行

  • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程

  • 我实现了以下promise函数,比如 cart.getbasket(req) Cart.UpdateBasket(req) Cart.UpdateDefaultShipport(req) cart.GetBasketObject(basket) 当前我执行代码时使用 我读过关于的文章,并想把它用作逻辑的流程,但当我使用时,它并不像预期的那样工作,因为我看到each的

  • 网址请求顺序是 souhu.com baidu.com tencent.com 这是什么原因呀?

  • 问题内容: 作者:HappyLittleFish 问题答案: