1

我怎样才能在javascript中做一个自旋锁?

我正在尝试加载一堆图像,并且只有在加载完所有内容后才能继续前进,所以我有一个类似的自旋锁

for(...)
   image[i].onload = function() { ++imagesloaded; }

while(imagesloaded != totalimages)
{
}

它使我的浏览器崩溃。有更好的方法吗?还是我缺少的产量/睡眠功能?

4

3 回答 3

3

简短的回答:不要自旋。


更长的答案:这是如何做到的:

var imagesLoaded = 0;
var totalImages = 42;

function handleImageLoad()
{
    imagesLoaded++;
    if (imagesLoaded === totalImages)
    {
        doSomething();
    }
}

for (var i=0; i<totalImages; i++)
{
    image[i].onload = handleImageLoad;
}

通常,当您想在 JavaScript 中休眠/等待/旋转时,请考虑通过回调(和setTimeout/ setInterval)来解决问题。

于 2011-11-06T22:43:23.860 回答
0

上面的答案没有用,因为由于浏览器中的限制/错误,可能需要自旋锁。例如,当您想在 javascript 中生成文件时,safari(希望不是将来的版本)需要使用方法 window.open。这样做的结果是您无法使用任何回调(因为弹出窗口阻止程序)生成文件,这实际上强制使用首先调用文件生成函数(使用回调)的对话框窗口,然后是下载文件的按钮. 因为自旋锁不起作用,所以代码如下:

function process(callback) {
  processCallbackData = null; // global var that must be a unique name
  callback(function(data) {
     processCallbackData = data;
  });
}

function fowardButton() {
  if(processCallbackData!=null) {
     goForwardUsingCallbackIncompatibleCode();
  } else {
     displayStillLoadingWarning();
  }
}
于 2018-08-31T07:22:46.370 回答
-1

不要使用循环来检查。检查事件处理函数。(所以你只在图像加载时进行检查,而不是尽可能快地连续检查)

于 2011-11-06T22:43:03.237 回答