理解Javascript异步块和回调

时间:2015-07-30 17:22:21

标签: javascript asynchronous callback

doA( function1(){
    doC();

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

    doE();
} );

doB();

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

  1. 调用A,返回并将function1发送到Queue,
  2. 致电B,
  3. 无需再执行 - >执行队列中的内容 - >致电C,
  4. 调用D,返回并将function2发送到Queue,
  5. 致电E,
  6. 6-没有更多要执行 - >致电F.
  7. 我的推理是否真的有道理? 我完全错了吗?

    这个问题来自阅读" 你不了解Javascript "作者:凯尔辛普森。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

  3. " 队列中的内容 - >致电C " - 事实上,function1在队列中,然后调用doC()和其他人。你不应该跳过这一步:-)同样叫doF()

答案 1 :(得分:0)

你快到了。

很难理解这种行为究竟会如何发展。与异步运行的其他函数相比,它可以在多长时间和密集程度上有所不同。

你缺少的另一个部分是" function1"本来不会要求返回功能" doA"。对于" function1"甚至运行,它需要" doA"在其运行期间的某个时间发出回调()。否则," doA"将简单地返回,并且不会调用您编写的任何嵌套函数。