了解 Javascript 异步块和回调

Understanding Javascript asynchronous blocks and callbacks

doA( function1(){
    doC();

    doD( function2(){
        doF();
    } )

    doE();
} );

doB();

假设 doA() 和 doD() 是异步调用,我们有以下顺序: A->B-C->D->E->F

  1. 调用 A,returns 并将函数 1 发送到队列,
  2. 呼叫 B,
  3. 没什么可执行的 -> 执行队列中的内容 -> 调用 C,
  4. 调用 D,returns 并将 function2 发送到 Queue,
  5. 呼叫E,
  6. 6-无需执行 -> 调用 F.

我的推理是否真的正确? 我完全错了吗?

这个问题来自阅读 Kyle Simpson 的“你不知道 Javascript”。

你快到了。

真的很难理解这种行为的实际结果。它可以根据每个函数调用与其他函数调用相比的持续时间和强度而有所不同 运行ning 异步。

您缺少的另一部分是 "function1" 不会固有地调用函数 "doA" 的 return。对于 "function1" 甚至 运行,"doA" 需要在其 运行 发出回调()期间的某个时间。否则,"doA" 将简单地调用 return 和 none 您编写的嵌套函数。

看起来这本书做得很好,你已经很好地理解了基础知识:-)

一些小问题可能会使您的推理更加精确:

  1. "假设 doA() 和 doD() 是异步调用" - 假设 doAdoB 是("asynchronous") 异步调用 作为参数传递给它们的回调函数的函数。我们可能会进一步限制他们调用相应的回调恰好一次(以避免混淆)。

  2. " 将 function1 发送到 Queue" - 它可能不会立即这样做。这就是后台处理的重点,回调仅在相应任务(由 doA()doD() 启动)完成时排队。一个简单的例子就是超时。如果有多个等待的异步回调,它们可能会以任意顺序调用,具体取决于它们的任务花费了多长时间。
    同样,当没有什么可执行时,它可能需要等待队列中出现一些东西,只要没有东西就空闲。

  3. "队列中有什么 -> 调用 C" - 事实上,function1 在队列中,然后调用 doC() 和其他人。您不应该跳过这一步 :-) 与调用 doF().

  4. 相同