JavaScript调用堆栈中的行是否可以是非;连续的;?

JavaScript调用堆栈中的行是否可以是非;连续的;?,javascript,javascript-events,reactjs,event-loop,Javascript,Javascript Events,Reactjs,Event Loop,我在Mobile Safari中遇到了一个非常非常奇怪的问题 我们使用来自Facebook的Flux dispatcher,它有一些非常简单的调度逻辑,大致如下(一切都是同步的): 这意味着,如果一个观察者触发另一个分派,则进入错误(“无法分派…”)分支 问题是,我们最终会出现这个错误,不是因为观察者正在调度,而是因为如果你非常快地敲打一个特定的按钮,touchend事件似乎会突然出现在调用堆栈中 通过在上面的guard子句中放入调试器语句,我们得到了导致“双重分派”的堆栈跟踪,这似乎是完全错误

我在Mobile Safari中遇到了一个非常非常奇怪的问题

我们使用来自Facebook的Flux dispatcher,它有一些非常简单的调度逻辑,大致如下(一切都是同步的):

这意味着,如果一个观察者触发另一个分派,则进入错误(“无法分派…”)分支

问题是,我们最终会出现这个错误,不是因为观察者正在调度,而是因为如果你非常快地敲打一个特定的按钮,touchend事件似乎会突然出现在调用堆栈中

通过在上面的guard子句中放入
调试器
语句,我们得到了导致“双重分派”的堆栈跟踪,这似乎是完全错误的

堆栈跟踪大致如下所示(已删除带注释和无聊的位):

从根到叶读取调用堆栈,您可以看到代码中的每个调用都反映在堆栈的下一层上,因此在
\u settlePromise
中,我们可以看到对
Dispatcher.dispatch(…)
的调用,在
Dispatcher.dispatch
中,我们可以看到
ui.recalulate()

一旦我们到达
重新计算
层,这就不是真的了<代码>重新计算
读取导致强制同步布局的某些UI元素的偏移量。堆栈中的下一个调用是触摸事件处理程序,我就是不明白。下一个滴答声中肯定会发生任何UI事件吗

对我来说,这似乎是一个浏览器问题。也许我不理解事件循环的全部复杂性,但奇怪的是,堆栈中突然出现了一个不相关的调用。据我们所知,这只发生在移动Safari上


有什么想法吗?此调用堆栈对任何人都有意义吗?

您可能想看一看,清楚一点,这种行为仅在Mobile Safari上发生?Dominic,我们无法在任何其他浏览器上重现。但这并不能证明它不会发生。这可能与执行同步布局所需的时间有关。Bergi,刚刚浏览了那篇文章,似乎很相关。我将在一秒钟内对其进行正确的读取,谢谢。我有完全相同的问题,请触摸调用堆栈中xhr.send或img.setAttribute下面的事件处理程序。你发现这件事了吗?
Dispatcher.dispatch = function (payload) {
  if (this.isDispatching) {
    throw new Error("Cannot dispatch while dispatching")
  }

  this.isDispatching = true

  try {
    this.notifyAllObservers(payload)
  } finally {
    this.isDispatching = false
  }

}
_settlePromise      - from an XHR
Dispatcher.dispatch - we dispatch a "searchResults" action
recalculate         - the UI needs to recalculate some layout (this includes an element.offsetLeft access)
touchendHandler     - where the hell did this come from??
Dispatcher.dispatch - BANG! (we haven't been able to set Dispatcher.isDispatching to false)