jQuery小部件:全局变量不一致

时间:2014-01-08 02:55:48

标签: javascript jquery widget

我有一个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()长时间运行,问题仍然存在。

有没有办法控制这个?

2 个答案:

答案 0 :(得分:3)

在某些情况下,浏览器中的javascript会异步运行 - 例如,想象通过网络加载资源。事实上,由于诸如头等功能等功能,它是相当不错的事情之一。

简短的回答是 - 不要使用全局变量。使用对象和事件来隔离行为,以便它们发生的顺序无关紧要。例如,在2个不同的对象上使用offset属性而不是为每个事件重用1。

答案 1 :(得分:3)

这是我在使用诸如extjs或jQuery之类的库时经常在Javascript中遇到的问题。

我到目前为止唯一可行的解​​决方案是通过锁处理变量设置。 Sux很大的制作时间,但它是唯一安全的处理方式。像

if (!this.lock) {
    this.lock = true;
    //do the actual function call
}

并且在完成第二个事件时我放置了解锁器,每次都使用运行同步的代码。

这是从这种事件驱动系统的概念中汲取的缺陷。如果您在事件驱动的环境中需要同步行为,则必须将锁定到位。