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