关于async/await输出顺序的题

发布于 2022-09-13 01:07:49 字数 691 浏览 23 评论 0

async function async1() {
  console.log('async1 start');
  await async2();
  console.log('async1 end');
}
async function async2() {
  console.log('async2 start');
  return new Promise((resolve, reject) => {
    resolve();
    console.log('async2 promise');
  })
}

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

async1();

new Promise(function(resolve) {
  console.log('promise1');
  resolve();
}).then(function() {
  console.log('promise2');
}).then(function() {
  console.log('promise3');
});
console.log('script end');

为什么打印顺序是promise2-promise3-async1 end,而不是promise2- async1 end - promise3呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

终陌 2022-09-20 01:07:49
  1. 去掉所有同步干扰
  2. 去掉 async 语法糖

你的题目等价于

new Promise(resolve => resolve(Promise.resolve())).then(() => {
  console.log('async1 end')
})

new Promise(function(resolve) {
  resolve();
}).then(function() {
  console.log('promise2');
}).then(function() {
  console.log('promise3');
});

最终问题转变为 new Promiseresolve 如果传入的是一个 Promise 将要怎么处理,这个问题可以参考

如何理解 resolve(Promise.resolve())内部执行了什么?

具体 C++ 内部如何实现的,我也不甚了解

护你周全 2022-09-20 01:07:49

尝试下把async 改成promise

   async function async1() {
      console.log('async1 start')
      await async2()
      console.log('async1 end')
    }
    async function async2() {
      console.log('async2 start')
      return new Promise((resolve, reject) => {
        resolve()
        console.log('async2 promise')
      })
    }
    async1()
    
    改成的promise,如下,替换后运行结果一样
    new Promise(function(resolve) {
      console.log('async1 start')
      resolve(
        new Promise(function(resolve2) {
          console.log('async2 start')
          resolve2(
            new Promise((resolve3, reject) => {
              resolve3()
              console.log('async2 promise')
            })
          )
        })
      )
    }).then(function() {
      console.log('async1 end')
    })

image.png

魂牵梦绕锁你心扉 2022-09-20 01:07:49
new Promise(function(resolve) {
  console.log('promise1');
  resolve();
}).then(function() {
  console.log('promise2');
}).then(function() {
  console.log('promise3');
});

这段代码中then的回调返回的不是Promise,相当于下面代码

new Promise(function(resolve) {
  console.log('promise1');
  resolve();
}).then(function() {
  console.log('promise2');
  console.log('promise3');
});

改写成下面这样可以达到你想要的的效果

new Promise(function (resolve) {
    console.log('promise1');
    resolve();
}).then(function () {
    return Promise.resolve(console.log('promise2'))
}).then(function () {
    console.log('promise3');
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文