为何异步代码只能由异步代码调用?请求详解深层原理
问题:为何异步代码必须由异步代码调用?
我理解async-await本质是基于Promises实现的,因此await之后的任何代码等同于then()中的回调函数。我也能直觉上理解,若将await之后的代码拆分为单独回调,其内部为何需要捕获之前的变量,但我不理解为何闭包要一直延伸至main函数?
核心解释
使用回调函数、Promises、async-await和生成器时,最终会将异步函数拆分为多个存放在堆中的闭包。函数会将最外层闭包传递给运行时。当事件循环或IO操作完成后,运行时会调用该闭包,程序从中断处继续执行。但这意味着调用栈中位于当前函数之上的所有函数都必须返回,整个调用栈仍需被展开。
这就是“红色函数只能由红色函数调用”规则的由来。你必须将整个调用栈全部闭包化,一直到
main()或事件处理器。
内容的提问来源于Stack Exchange,提问作者Matt Styles
相关产品推荐
相关产品推荐

