V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
moyuman
V2EX  ›  问与答

一个 Promise/async/await 的执行顺序问题求助🙏

  •  
  •   moyuman · 124 天前 · 987 次点击
    这是一个创建于 124 天前的主题,其中的信息可能已经有所发展或是发生改变。
    async function async1() {
      async2().then(() => {
        console.log('async1 end');
      });
    }
    async function async2() {
      return new Promise((resolve, reject) => {
        resolve();
      })
    }
    
    async1();
    new Promise(function(resolve) {
      resolve();
    }).then(function() {
      console.log('promise2');
    })
    

    输出结果为

    promise2
    async1 end
    

    (面试时候遇到的,去掉了无关的 log)

    想知道为什么 promise2 早于 async1 end ?

    我的想法是 async2() 的 then 方法早于 new Promise 的 then 方法执行,那么其回调函数就应该先被放入微任务队列,也就应该先被执行,但实际情况不是这样。

    另外,如果我把 async1async2async 关键字去掉,那么输出就变为

    async1 end
    promise2
    

    求大佬解答

    4 条回复    2024-08-28 15:25:43 +08:00
    Xu3Xan89YsA7oP64
        1
    Xu3Xan89YsA7oP64  
       124 天前   ❤️ 1
    async 函数本身还会将返回的内容包一层 promise ,你把 async2 的 async 去掉或者直接 return undefined 才是你要的效果
    xiangyuecn
        2
    xiangyuecn  
       124 天前
    看起来是 async2 的 async 影响了 then 的执行,只需去掉 async2 的 async 就符合脑回路了,看不懂的代码一律当做玄学处理😂
    moyuman
        3
    moyuman  
    OP
       124 天前
    @shizhibuyu2023 我知道了,确实是被隐式的包了一层 promise ,去掉 async 之后可以同等转换为
    ```js
    function async2() {
    return Promise.resolve().then(() => {
    return new Promise((resolve, reject) => {
    resolve();
    });
    })
    }
    ```
    这个时候其实最先被放入微任务队列的是
    ```js
    return new Promise((resolve, reject) => {
    resolve();
    });
    ```
    然后是 promise2
    这样就对了
    moyuman
        4
    moyuman  
    OP
       119 天前
    reopen 一下,又查了一下相关文档,还是有疑问。

    async 对返回值是用了 Promise.resolve 包了一层,而 Promise.resolve 在传入一个 promise 时,会原封不动的返回。

    按照这个理论,async2 应该被转换为
    function async2 () {
    return new Promise((resolve, reject) => {
    resolve();
    })
    }
    但实际情况却不是
    我想问的是,async 这个关键字到底做了何种转换?如果返回值是一个 promise ,其转换会有什么不同么?对执行顺序又有何影响?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5133 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 01:15 · PVG 09:15 · LAX 17:15 · JFK 20:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.