如何实现异步调用堆栈

时间:2019-03-12 17:14:11

标签: function compiler-construction callstack

假设您具有此功能序列(JavaScript)。...

A(function(){
  console.log('done')
})

function A(done) {
  a()
  B(D, done)
}

function B(x, y) {
  x(function(){
    c()
    C(y)
    d()
  })
}

function C(z) {
  g()
  setTimeout(z, 1000)
}

function D(z) {
  h()
  setTimeout(z, 2000)
}

function a() {
  b()
  c()
}

function b() {
  // ... sync stuff
}

function c() {
  e()
  // ... sync stuff
  f()
}

function d() {
  // ... sync stuff
}

尝试使之具有某种复杂的调用堆栈。

我想知道的是在不同时间点调用堆栈的外观。例如,c();C(y);d()序列。调用c()时,要在该级别调用的 next 函数为C()。因此,似乎将其推入堆栈(在评估c()之前),C()是返回位置。然后转到e()f()(暂时忽略它们)。然后,它检查调用堆栈并返回到C()。然后相同的过程。但是由于C()是异步的,因此它会在d()完成之前转到C()。就像这样:

c   c   c   c   c   c     c    ...?
    C   C   C   C   C    /  \
        e   e   f       C    d
            f

这就是我试图映射调用堆栈时要去的地方。好像它会形成一棵树。现在想象一下,多个异步进程几乎同时开始。这就像是一棵树的多个分支。因此,不是调用堆栈,而是调用树。这最终使我怀疑调用堆栈如何得到准确评估。 何时将序列中的下一个函数压入调用堆栈,然后如何更新/删除最后完成的函数并找到返回到调用中下一个位置的方式堆栈/树。

想知道您是否可以指出任何描述此内容的资源,或者甚至可以解释我在上面描述的示例中调用堆栈的外观。

0 个答案:

没有答案