JS async/await 不能阻塞返回 非Promise对象 测试

JS async/await 不能阻塞返回 非Promise对象

  • 测试代码1
async function fn1(){
  console.log(1);
  await pr1();
  await pr2();
  console.log(2);
};

function fn2(){
  console.log(3);
};

function pr1(){
  
    setTimeout(() => {
      console.log(4);
      resolve();
    }, 2000);
  
};

function pr2(){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(5);
      resolve();
    }, 1000);
  });
};

(async ()=>{
    await fn1();
    fn2();
})();
输出:15234
  • 测试代码2

从表现上来看,似乎区别在pr1 的返回是一个 promise对象

async function fn1(){
  console.log(1);
  await pr1();
  await pr2();
  console.log(2);
};

function fn2(){
  console.log(3);
};

function pr1(){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(4);
      resolve();
    }, 2000);
  });
};

function pr2(){
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log(5);
      resolve();
    }, 1000);
  });
};

(async ()=>{
    await fn1();
    fn2();
})();
输出:15234

(1)await后面如果不是一个promise对象,那么它就按正常的js顺序执行,先执行同步代码,当主线程空闲了,再去执行异步队列的任务!

(2)await后面如果是promise对象,那么await后面的内容还是相当于在then执行,跟promise的区别在于,如果等待的是一个promise对象,那么要等待这个对象解析完成,如果没有resolve或者reject,那么后面的内容就不会执行;如果有resolve或者reject,那么后面的内容正常执行。

原文链接:https://blog.csdn.net/MRlaochen/article/details/118799759

posted @ 2022-04-27 16:01  STR少寒  阅读(165)  评论(0编辑  收藏  举报