一般的的函数只有遇到return,throw时调用方会跳出函数,而async修饰的函数则加入了await的情况。
也就是说await可以看做一种变种的return,在调用方线程执行到await时会选择跳出函数,把这个函数的上下文委托给其它线程继续执行。
主线程跳出去后,可以想象新增了两个额外的线程A和B。(主线程我们叫做Main)
Main跳出async修饰的函数后,A线程执行await所等待的函数、B则会阻塞在await所在的位置,等待A返回await的结果好继续执行await之后的内容。
[sc name="note" ]所以异步设计的初衷、并不是彻底抹除阻塞,而是不让主线程阻塞。[/sc]
至于"如何让B阻塞的时间变少"、或者"压根不存在B,让A干完活直接执行await后面的内容"——就是优化的事情了。