async 同步执行问题

hason
  • 55

我在用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呢

回复
阅读 537
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执行那样

你知道吗?

宣传栏