js中的宏任务一般是:包括整体代码script,setTimeout,setInterval。
微任务是:Promise,process.nextTick。
说一下我对于async/await的理解:
1.async做了一件什么事情?
async将你的函数返回值转换为promise对象,不需要显式地返回promise对象(也可以显示的返回一个promise),async关键字自动将函数的返回值变为promise对象。
2.await的作用
await关键字只能在带有async关键字的函数内部使用,在外部使用时会报错。await等待的是右侧的[表达式结果],如果右侧是一个函数,等待的是右侧函数的返回值,如果右侧的表达式不是函数则直接是右侧的表达式。await在等待时会让出线程阻塞后面的执行。await的执行顺序为从右到左,会阻塞后面的代码执行,但并不是直接阻塞await的表达式。
await之后如果不是promise,await会阻塞后面的代码,会先执行async外面的同步代码,等外面的同步代码执行完成在执行async中的代码。
如果它等到的是一个 promise 对象,await 也会暂停async后面的代码,先执行async外面的同步代码,等着 Promise 对象 resolved,然后把 resolve 的参数作为 await 表达式的运算结果。
[
](https://blog.csdn.net/qq_41681425/article/details/85775077)
await后如果是一个函数,则会立即执行函数内除了return以外的所有代码,如果函数中有宏任务则加入宏任务队列,微任务加入微任务队列,然后让出线程执行async外的代码后,再返回await处依次执行微任务和宏任务,最后获得return的返回值。
简单说,async是通过Promise包装异步任务。
比如有以下代码:
async function async1() {
await async2()
console.log('async1 end')
}
async function async2() {
console.log('async2 end')
}
async1()
改为ES5的写法:
new Promise((resolve, reject) => {
// console.log('async2 end')
async2()
...
}).then(() => {
// 执行async1()函数await之后的语句
console.log('async1 end')
})
当调用 async1 函数时,会马上输出 async2 end,并且函数返回一个 Promise,接下来在遇到 await的时候会就让出线程开始执行 async1 外的代码(可以把 await 看成是让出线程的标志)。
然后当同步代码全部执行完毕以后,就会去执行所有的异步代码,那么又会回到 await 的位置,去执行 then 中的回调。