async和await的区别
1,saync是“异步”的简写,await可以认为是async await的简写
2,async用于声明一个函数是异步的,await用于等待一个异步方法执行完成
async的作用
async的返回值是一个Promise函数
返回结果:
要处理这个promise对象,我们需要使用.then链
返回结果
如果async没有返回值的情况下,会返回undefined
await的作用
await作为async函数执行完成,返回的一个表达式,这个表达式可以是一个promise对象或者是其他值(换句话说,没有特定值)
返回结果
await等到结果之后
await是个运算符,用于组成表达式,await表达式的运算结果取决于他等到的东西。
如果等到的是promise对象,那么就会造成await阻塞,等promise对象resolve,然后得到resolve的值,作为await表达式的运算结果
这就是await必须在async函数中的原因,async函数调用不会造成堵塞,它内部所有的堵塞都被封装在一个promise对象中异步执行
上面例子三秒后输出hello world
表明async/await在同步和异步之间的用处,asyncPrint函数里面的同步操作comsole.log必须要等之前的await执行完之后才能被执行
async await优势在于处理then
单一的promise链并不能发现async/await优势,但是如果需要处理多个promise链的时候,async/await优势就凸显出来了,promise通过多层then链来解决多层回调问题,现在async/await又来进一步优化它
同步异步执行顺序
这个涉及到JavaScript的执行机制EventLoop,大概意思是这样的:
1,引擎先判断JS代码是同步还是异步,同步就进入主线程,异步就执行event table
2,异步任务在event table中注册函数,当满足触发条件后,被推入event queue
3,同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有,就推入主线程
所以,即便是物理位置,异步代码在同步代码之前,也会先执行同步代码,在执行异步代码