1. Promise 有三种状态:
    pending: 进行态,初始状态,且还没有没有触发达到 fulfilled / rejected
    fulfilled: 成功态,pending 态调用 resolve
    rejected: 失败态,pending 态调用 reject,或 throw Error,或 catch 里 return

  2. 主线程(同步代码)跟微任务(Promise 状态变成 fulfilled / rejected 后)是两个执行上下文环境

因此,当直接 Promise pending 态时 throw Error,会变成 fulfilled 态,此时放进微任务队列,主线程接着执行,并退出当前 try-catch 执行环境,待 Promise 微任务执行时,已经不是 try-catch 执行上下文了。

当使用 await 时,await 可以理解为就是对一个表达式求值,如果这个表达式是 Promise,且它是 fulfilled,那么就会直接抛出这个 Error。又由于 await 是协程,所以 try catch 跟 await 在同一个执行上下文中,所以能够 catch 住这个 Error。