假设我有以下代码来预加载2张图像,并且仅在和图像均已加载后才执行以下操作:
var numLoaded = 0;
function OnImageLoaded()
{
numLoaded++;
if (numLoaded==2) alert("Got 'em!");
}
var a = new Image();
var b = new Image();
a.onload = OnImageLoaded;
b.onload = OnImageLoaded;
a.src = 'foo.jpg';
b.src = 'bar.jpg';
分配
a.src
和b.src
会使这两个图像均在后台加载,然后调用OnImageLoaded()
即可将其准备就绪。显然,
if (numLoaded==2)
之后的代码只能运行一次。现在,是否有可能发生这种情况:
numLoaded++
将计数器增加到一个,numLoaded++
将计数器增加到两个,numLoaded==2
,因此代码被执行numLoaded==2
仍然是正确的,因此应该运行一次的代码再次被执行 ←问题! 这是一次机会(尽管很小),如何避免这种情况?在其他语言中,我将为此使用临界区或互斥体,或者使numLoaded易失,并使用
n=(++numLoaded)
或其他方式,但是我该如何在JS中进行此操作? 最佳答案
正常情况下为does not run concurrently。使用Node.js可以做到这一点,但是这很困难,对于典型情况,您不必担心。
关于javascript - JavaScript:异步事件回调具有线程安全性吗? (我需要 'volatile'还是其他?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32574601/