Skip to content

JavaScript 异步:一道不错的面试题 #15

@ifyour

Description

@ifyour

请看题:

async function async1() {
  console.log('async1 start');
  await async2();
  console.log('async1 end');
}

async function async2() {
  console.log('async2');
}

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

async1();

new Promise(function(resolve) {
  console.log('promise1');
  resolve();
}).then(function() {
  console.log('promise2');
});

console.log('script end');

一、await 后面的表达式

  1. Promise 实例。
    如果不是 promise , await 会阻塞后面的代码,先执行 async 外面的同步代码,同步代码执行完,再回到 async 内部,把这个非 promise 的东西,作为 await 表达式的结果。

  2. Promise 实例。
    如果它等到的是一个 promise 对象,await 也会暂停 async 后面的代码,先执行 async 外面的同步代码,等着 Promise 对象 fulfilled,然后把 resolve 的参数作为 await 表达式的运算结果。

二、宏任务/微任务队列

  1. 第一步
    image

  2. 第二步
    image

  3. 第三步
    image

  4. 第四步
    image

  5. 第五步
    image

  6. 第六步
    image

  7. 第七步
    image

  8. 第八步
    image

三、答案

script start 
async1 start 
async2 
promise1 
script end 
promise2 
async1 end 
setTimeout 

浏览器控制台输出
image

四、相关文章

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions