2013-03-27 55 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