我有一个jQuery小部件,其中包含变量this.options._offset
和函数_drawPlot()
。当用户拖动时drop,函数_drawPlot()
将被执行,this.options._offset
将在最后更新。
现在的问题是,用户可能会拖延&下降得太快,使变量_offset
不一致。例如,两个拖动&删除操作A和B,执行顺序可能是:
A: plotting
A: update offset
B: plotting
B: update offset
或者:
A: plotting
B: plotting
A: update offset
B: update offset
对于第二种情况,值offset
不正确。我认为JS是单线程的,并且从未预料到会发生这种情况。它就像操作系统中的信号量。或者只是因为console.log
欺骗了我?但无论如何,使用_drawPlot()
的函数_offset
行为错误。
我知道我可以限制操作,但即使在限制之后,如果_drawPlot()
长时间运行,问题仍然存在。
有没有办法控制这个?
答案 0 :(得分:3)
在某些情况下,浏览器中的javascript会异步运行 - 例如,想象通过网络加载资源。事实上,由于诸如头等功能等功能,它是相当不错的事情之一。
简短的回答是 - 不要使用全局变量。使用对象和事件来隔离行为,以便它们发生的顺序无关紧要。例如,在2个不同的对象上使用offset属性而不是为每个事件重用1。
答案 1 :(得分:3)
这是我在使用诸如extjs或jQuery之类的库时经常在Javascript中遇到的问题。
我到目前为止唯一可行的解决方案是通过锁处理变量设置。 Sux很大的制作时间,但它是唯一安全的处理方式。像
if (!this.lock) {
this.lock = true;
//do the actual function call
}
并且在完成第二个事件时我放置了解锁器,每次都使用运行同步的代码。
这是从这种事件驱动系统的概念中汲取的缺陷。如果您在事件驱动的环境中需要同步行为,则必须将锁定到位。