2013-03-27 53 views
0

我试图通过从互联网上下载3个图像文件,并平均加载它们花费的时间来实现speedtest。如果出于任何原因有错误,我想跳过加载该图像并继续下一个。如果错误发生在最后一张图片上,那么我想计算当时的平均速度并返回给调用者。JavaScript抑制错误,并继续在for循环

现在,一旦发生错误(我故意更改了图像的网址,因此它不存在),它不会进一步。我试过从.onerror函数返回true,但没有运气。有什么建议么?

 var images = [{ 
      "url": 'http://<removed>250k.jpg?n=' + Math.random(), 
      "size": 256000 
     }, { 
      "url": 'http://<removed>500k.jpg?n=' + Math.random(), 
      "size": 512000 
     }, { 
      "url": '<removed>1000k.jpg?n=' + Math.random(), 
      "size": 1024000 
     } 
    ]; 


function calculateBandwidth() { 
    var results = []; 
    for (var i = 0; i < images.length; i++) { 
     var startTime, endTime; 
     var downloadSize = images[i].size; 
     var download = new Image(); 
     download.onload = function() { 
      endTime = (new Date()).getTime(); 

      var duration = (endTime - startTime)/1000; 
      var bitsLoaded = downloadSize * 8; 

      var speedBps = (bitsLoaded/duration).toFixed(2); 
      var speedKbps = (speedBps/1024).toFixed(2); 
      var speedMbps = (speedKbps/1024).toFixed(2); 

      results.push(speedMbps); 

      //Calculate the average speed 
      if (results.length == 3) { 
       var avg = (parseFloat(results[0]) + parseFloat(results[1]) + parseFloat(results[2])).toFixed(2); 
       return avg; 
      } 
     } 
     download.onerror = function (e) { 
      console.log("Failed to load image!"); 
      return true; 
     }; 
     startTime = (new Date()).getTime(); 
     download.src = images[i].url; 
    } 
} 
+0

看看尝试/ catch块 – 2013-03-27 00:19:02

+0

你回来时,它失败了这就是为什么我猜 – btevfik 2013-03-27 00:19:12

+0

有没有必要返回,一旦你回来你打破你的循环 – Ryoku 2013-03-27 00:25:58

回答

0

我想你没有做的是控制每个事件发生的过程。每个onerroronload都告诉你,过程停止了,而不是它应该退出本身。你初始化一个图像,它不加载,可能需要注意,否则继续。

事情是,你在onload的末尾也做同样的事情。也就是说,做任何测量,然后移动到下一个,或者,如果没有更多,运行清理和报告或什么的脚本。

例如:

var site = 'http://upload.wikimedia.org/', 
    imgs = [ 
    'wikipedia/commons/6/6e/Brandenburger_Tor_2004.jpg', 
    'wikipedia/commons/a/ad/Cegonha_alsaciana.jpg', 
    'wikipe/Cegonha_alsaciana.jpg', 
    'wikipedia/commons/d/da/CrayonLogs.jpg', 
    'wikipedia/commons/1/17/Bobbahn_ep.jpg', 
    'wikipedia/commons/9/90/DS_Citro%C3%ABn.jpg', 
    'wikipedia/commons/f/f0/DeutzFahr_Ladewagen_K_7.39.jpg', 
    'wikipedia/commons/c/c7/DenglerSW-Peach-faced-Lovebird-20051026-1280x960.jpg', 
    'wikipedia/commons/4/4d/FA-18F_Breaking_SoundBarrier.jpg' 
]; 

我的图片的阵列。提示,wikipe/Cegonha_alsaciana.jpg将不会加载。应预先警告,这些都很大,载入速度很慢,我使用高速缓冲存储器来阻止它们烧制onload s。

getimg(); 

在小提琴,这是所有内window.onload事件处理程序,所以当被调用,这个初始化过程。我本身没有设置阶段,否则我可能会将其称为init()setup()

function getimg() { 
    var img = document.createElement('img'), 
     path = imgs.shift(); 

    if (path) { 
     img.onload = loaded; 
     img.onerror = notloaded; 
     img.src = site + path + '?cach=bust' + Math.floor(Math.random() * 9999); 

     console.log('Loading ', img.src); 

     document.body.appendChild(img); 
    } else { 
     console.log('Finished loading images.'); 
    } 

    function loaded(e) { 
     console.log('Loaded ', e.target.src); 
     next(); 
    } 

    function notloaded(e) { 
     console.log('Not loaded ', e.target.src); 
     next(); 
    } 

    function next() { 
     console.log(imgs.length, ' imgs left to load.'); 
     getimg(); 
    } 
} 

http://jsfiddle.net/userdude/vfTfP/

这确实你想要做什么,不计时机制内置。我可以将事情分解成步骤,行动和事件,以便我可以根据需要控制步骤。以一种基本的方式,你的脚本不应该有太大的不同。

+0

感谢您指点我正确的方向! – tempid 2013-04-04 23:18:33