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包装异步任务。
    比如有以下代码:

    1. async function async1() {
    2. await async2()
    3. console.log('async1 end')
    4. }
    5. async function async2() {
    6. console.log('async2 end')
    7. }
    8. async1()

    改为ES5的写法:

    1. new Promise((resolve, reject) => {
    2. // console.log('async2 end')
    3. async2()
    4. ...
    5. }).then(() => {
    6. // 执行async1()函数await之后的语句
    7. console.log('async1 end')
    8. })

    当调用 async1 函数时,会马上输出 async2 end,并且函数返回一个 Promise,接下来在遇到 await的时候会就让出线程开始执行 async1 外的代码(可以把 await 看成是让出线程的标志)。
    然后当同步代码全部执行完毕以后,就会去执行所有的异步代码,那么又会回到 await 的位置,去执行 then 中的回调。