2015-10-12 48 views
0

我使用的技術在這裏的第二個答案:在循環中使用的setInterval改變間隔

Changing the interval of SetInterval while it's running

,但在區間的變化沒有被設置。代碼也在使用OpenLayers 3:

 var coordinate, 
      i = 1, 
      length = multipointCoords[0].length; 

     var currentTime = tracksTime[0]; 
     var nextTime = tracksTime[1]; 
     speedOption = 100; // the highter this value, the faster the tracks, see next line 
     var transitionTime = (nextTime - currentTime)/speedOption; 

     var timer; 

     timer = setInterval(function() { 
      segmentConstruction(multipointCoords, tracksTime); 
     }, transitionTime); 

     function segmentConstruction(multipointCoords, tracksTime) { 
      coordinate = ol.proj.fromLonLat(multipointCoords[0][i]); 
      lineString.appendCoordinate(coordinate); 

      if (i === length - 1) { 
       clearInterval(timer); 
      } else { 
       i++; 
       map.addLayer(trackLayer); 
       clearInterval(timer); 
       currentTime = tracksTime[i]; 
       nextTime = tracksTime[i + 1]; 
       timer = setInterval(function() { 
        segmentConstruction(multipointCoords); 
       }, transitionTime); 
      }; 
     }; 

我在做什麼錯?

謝謝。

+0

當你清楚你的間隔是當你需要創建一個新的。這也是當你需要重新計算你的區間值的時候,否則它會以相同的速度運行。目前,如果'我===長度 - 1'的間隔將停止,就是這樣。我認爲你想在那一點上改變間隔速度? – ste2425

+0

哦,我應該澄清。當我===長度爲1時,循環應該結束。線串將完成。這是else語句中不起作用的代碼。基本上,我逐段渲染矢量線(線串)。 – interwebjill

+0

我本可以寫成 'if(i interwebjill

回答

1
var currentTime = tracksTime[0]; 
    var nextTime = tracksTime[1]; 
    speedOption = 100; // the highter this value, the faster the tracks, see next line 
    var transitionTime = (nextTime - currentTime)/speedOption; 

您在這裏計算transitionTime。

 if (i === length - 1) { 
      clearInterval(timer); 
     } else { 
      i++; 
      map.addLayer(trackLayer); 
      clearInterval(timer); 
      currentTime = tracksTime[i];//<------------------| 
      nextTime = tracksTime[i + 1];//<-----------------| 
      timer = setInterval(function() {//    | 
       segmentConstruction(multipointCoords);//  | 
      }, transitionTime);// <----------------------------->Not redefined 
     }; 

這裏您使用與上面相同的transitionTime,它不會被重新定義! 爲什麼不,這不是一個錯誤,但...

我不認爲你的問題來自計時器,但從你的參數。

這裏是一段代碼,看看你的代碼有關時間和間隔沒有問題: 我剛剛刪除了所有不關心的'時間'和時間間隔。

var log = function(val){ 
 
    console.log(val); 
 
    document.getElementById('el').innerHTML+='<div><pre>' + val + '</pre><div>'; 
 
    } 
 

 
var timer , 
 
    i = 1 , 
 
    length = 5 , 
 
    transitionTime = 200 ; 
 

 

 

 
     timer = setInterval(function() { 
 
      log('first timerId : ' + timer); 
 
      
 
      segmentConstruction() 
 
     
 
     }, transitionTime); 
 

 
     function segmentConstruction(multipointCoords, tracksTime) { 
 
      log(' \tsegmentConstruction : i = ' + i + '/' + length); 
 
     
 
      //if (i === length - 1) { 
 
      if (i >= length - 1) { 
 
       clearInterval(timer); 
 
       log('\t\twe finish with : i = ' + i + '/' + length); 
 
      } else { 
 
       i++; 
 
       clearInterval(timer); 
 
       timer = setInterval(function() { 
 
        log('loop timerId : ' + timer); 
 
        segmentConstruction(); 
 
       }, transitionTime); 
 
      }; 
 
     };
<div id='el'></div>

+0

我認爲你是對的。我需要在'else'語句中重新定義transitionTime。我認爲這個定義會從上面繼續。 – interwebjill

+0

還有一件事要檢查,就是你永遠不會以優於長度的'if(i === length - 1){'應該由'if(i> = length - 1){'!我更新了我的代碼。 – Anonymous0day