async 同步执行问题

我在用electron 我打算创建一个sqlite文件后 执行数据库迁移,然后export db
但是我写了 一个类似下面这样的同步方法 打印结果 1,3,5,4,2

(async ()=>{
  console.log('------1------')
  setTimeout(()=>{
    console.log('------2------------')
  },5000)
  console.log('--------3-----------')
  await test();  //数据库迁移
  console.log('------4------')
})();

console.log('------5------')

我在想无论我写的同步是否执行都应该打印 1,3,4,5,2.
为什么我同步执行的 会阻塞4 而不会阻塞5呢

阅读 2.3k
4 个回答

先试着把async/await转换成Promise

new Promise(resolve => {
  console.log('------1------')
  setTimeout(()=>{
    console.log('------2------------')
  },5000)
  console.log('--------3-----------')
  new Promise((resolve) => {
    resolve()
  }).then(()=>{
    console.log('------4------')

  })
})

console.log('------5------')

自执行函数是async的,4和5不在一个阶段

async 函数中 在await前是同步的
也就是 1,3,5 都是同步 2(因为setTimeout)、4 是异步的

同步执行 指的是 async内部的 await与await 之后的代码关系。 不是指async函数 与其他函数的关系。async 执行碰到 await 然后执行了await语句 会返回一个未完成的promise。

async函数执行需要加上await关键字才会阻塞下面的程序,就像test执行那样

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题