async 函数一定会返回一个 promise 对象。如果一个 async 函数的返回值看起来不是 promise,那么它将会被隐式地包装在一个 promise 中。
如
async function foo() {
  return 1;
}
等价于
function foo() {
  return Promise.resolve(1);
}

在 await 表达式之后的代码可以被认为是存在在链式调用的 then 回调中,多个 await 表达式都将加入链式调用的 then 回调中,返回值将作为最后一个 then 回调的返回值。

执行代码理解

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function f1() {
  console.log("???");
  var x = await resolveAfter2Seconds(10);
  console.log(x); // 10
}
f1();
console.log(3);
//对于这段代码,加深对async await的理解,假如在wait一个结果,并不会在这里阻塞,使用多线程理解的话,就是把这个交给一个新的线程来执行,自己继续执行其他事情去了