首页 > 试题广场 >

关于下面JS代码说法正确的是() console.log('

[不定项选择题]
关于下面JS代码说法正确的是()
console.log('start')
async function ac () {
  console.log('ac-start');
  await new Promise((resolve) => {
    resolve('p3');
  }).then((res) => {
    console.log(res);
  });  
  await new Promise((resolve) => {
    console.log('p1');
    return 'p2';
  })
  console.log('success');
  return 'ac-end';
}
ac().then(res => console.log(res));
console.log('end');
  • 第一个Promise,状态被切换为Resolved,允许代码继续往下执行
  • 代码的打印顺序是:start ac-start end p3 p1
  • 代码的打印顺序是:start ac-start end p3  p1 p2
  • 第二个Promise,函数有返回,允许代码继续往下执行,能够打印出p2
console.log('start')
 async function ac () {
  console.log('ac-start');

//promise1//  
await new Promise((resolve) => {
    resolve('p3');
  }).then((res) => {
    console.log(res);
  });
   //promise2//  
await new Promise((resolve) => {
    console.log('p1');
    return 'p2';
  })
  console.log('success');
  return 'ac-end';
}
ac().then(res => console.log(res));
console.log('end');
同步队列->微队列->宏队列
注意:.then方***将执行内容包装为微任务
同步任务:
log('start')
执行ac(),不执行.then,因为ac目前还是pending状态。
log('ac-start')
执行promise1的创建,并将promise1的状态切换为fulfilled,返回'q3'
注意这里promise1虽然resolve('p3'),但是.then方法将log(res)放入了微任务队列,而且由于promise1是通过await处理,其后面的所有代码都将放入微任务队列。
log('end')  
至此同步队列清空

微队列:
log('res') //res === 'q3'
执行promise2的创建并且执行log('p1')promise2的状态未被更改依然是pending
await无法获取promise2的结果,导致后续代码无法执行
此时ac目前还是pending状态。无法执行ac().then方法
因此执行结果为
start ac-start end p3 p1
以上谨代表个人观点,欢迎指正
发表于 2025-07-11 21:12:52 回复(0)