promise、async、await、settimeout异步原理与执行顺序

    1. async function async1() {
    2. console.log('async1 start');
    3. await async2();
    4. console.log('async1 end');
    5. }
    6. async function async2() {
    7. console.log('async2');
    8. }
    9. console.log('script start');
    10. setTimeout(function () {
    11. console.log('settimeout');
    12. }, 0);
    13. async1();
    14. new Promise(function (resolve) {
    15. console.log('promise1');
    16. resolve();
    17. }).then(function () {
    18. console.log('promise2');
    19. });
    20. console.log('script end');

    执行结果

    1. script start
    2. VM3037:2 async1 start
    3. VM3037:7 async2 // ### 见解析
    4. VM3037:15 promise1
    5. VM3037:20 script end
    6. VM3037:4 async1 end // ### 见解析
    7. VM3037:18 promise2
    8. VM3037:11 settimeout

    await是一个让出线程的标志。await后面的函数会先执行一遍,然后就会跳出整个async函数来执行后面js栈的代码,等本轮事件循环执行完了之后又会跳回到async函数中等待await后面表达式的返回值,如果返回值为非promise则继续执行async函数后面的代码,否则将返回的promise放入promise队列。

    附:多嵌套一个async3

    1. async function async1() {
    2. console.log("async1 start");
    3. await async2();
    4. console.log("async1 end");
    5. }
    6. async function async2() {
    7. await async3();
    8. console.log("async2");
    9. }
    10. async function async3() {
    11. console.log("async3");
    12. }
    13. console.log("script start");
    14. setTimeout(function () {
    15. console.log("settimeout");
    16. }, 0);
    17. async1();
    18. new Promise(function (resolve) {
    19. console.log("promise1");
    20. resolve();
    21. }).then(function () {
    22. console.log("promise2");
    23. });
    24. console.log("script end");

    运行结果

    1. script start
    2. VM38:2 async1 start
    3. VM38:11 async3
    4. VM38:19 promise1
    5. VM38:24 script end
    6. VM38:8 async2
    7. VM38:22 promise2
    8. VM38:4 async1 end
    9. VM38:15 settimeout