有人可以用比这更多的话解释为什么异步代码需要由异步代码调用吗?我知道 async-await 只是底层的承诺,因此,await 之后的任何代码都相当于
then()
中的回调,这是有道理的。我也有一个直觉,为什么在内部等待之后的代码需要关闭它之前的任何内容(如果它被分解为一个单独的回调)。我不明白为什么它一直关闭回到主程序?
因此,使用回调、promise、async-await 和生成器,您最终会采用异步函数并将其涂抹到一堆存在于堆中的闭包中。 您的函数将最外面的一个传递到运行时。当事件循环或 IO 操作完成时,它会调用该函数,然后您可以从上次中断的地方继续执行。但这意味着你之上的一切也必须回归。您仍然需要展开整个堆栈。 这就是“红色函数只能被红色函数调用”规则的由来。您必须关闭整个调用堆栈,一直返回到 main() 或事件处理程序。
https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/
为什么异步代码只能被异步代码调用?
正如所写,这不太正确:您可以从任何您喜欢的地方调用它。但是,如果您关心结果(通常是这种情况),那么您将需要等待其他异步代码完成,这反过来会使您的代码异步。您无法与尚不存在的值进行交互。
我不明白为什么它一直关闭回到主程序?
作者的意思是异步代码将一次执行一点,中间有一段时间不执行任何代码。因此,代码将运行一段时间来进行设置(例如,发出网络请求或启动计时器),然后返回。对于异步/等待代码,是
await
关键字告诉它返回。最终,代码执行将恢复。如果您使用回调或 .then 进行编写,那么这显然是一个正在执行恢复的单独闭包。在 async/await 的情况下,该细节对您来说是隐藏的,但它仍然是与异步函数第一次运行时不同的调用堆栈。