async/await的理解和使用

pupyy / 2023-08-15 / 原文

1. 等待的是Promise

1.1 await Promise 状态改变

function fn() {
  // ! 有return await等待的才是一个 resolved 的 Promise,await 表达式的值就是 resolve() 传递的值
  return new Promise((resolve, reject) => {
    console.log('有resolve或reject');
    // resolve('res.data'); 1.
    reject('reason'); // 2.
    // 调用 resolve 或 reject 并不会终结 Promise 的参数函数的执行,除非 return resolve('xxx')。
    console.log('在resolve之后');
  });
}

async function foo() {
// 捕获异常
  try {
	// 发送 http 请求,这样就可以类似同步阻塞,获取到请求的数据后再处理
    const result = await fn(); // resolve('res.data');
    // 这之后的代码相当于在Promise.prototype.then()里面执行,是异步微
    console.log('return:' + result); 
  } catch (error) {
    console.log(error);
  }
}

foo();

1的执行结果:

// 有resolve或reject
// 在resolve之后
// return:res.data

2的执行结果:

// 有resolve或reject
// 在resolve之后
// reason

1.2 等待的promise没有resolve或reject

function fn() {
  return new Promise((resolve, reject) => {
    console.log('等待的promise没有resolve或reject');
  });

}

async function foo() {
  const result = await fn();
  console.log('我永远不会执行');
}

foo();

执行结果:

// 等待的promise没有resolve或reject

2. 等待的不是Promise

function func() {
  setTimeout(() => {
    console.log('等待的不是promise');
  }, 2000);
}

async function fo() {
  await func();
  console.log('我不会被阻塞');
}

fo();

执行结果:

// 我不会被阻塞
// 等待的不是promise

注:async/await必须在函数中使用