2016-06-22 4 views
0

Ich versuche, fließendes gestapeltes Flächendiagramm mit d3.js zu erstellen. Ich habe das Diagramm mit einem bestimmten Bereich arbeiten. Ich treffe den Service alle 10ms und erhalte alle Daten und trigse dann ein Ereignis aus, um das Diagramm zu starten. Wie auch immer, meine Grafik funktioniert nur 30 Minuten später. Ich versuche das Intervall neu einzustellen. Wenn ich versuche, das zu tun, gibt es einen Ruck in der Grafik und irgendwie bricht es. Ich bin mir nicht sicher, ob ich es richtig mache. Hier ist Code zum Anschauen.Reset-Intervall unterbricht meinen kontinuierlichen Fluss des Diagramms

var numbers = []; 
    var values = []; 
    var flag = false; 
    var fd; 
    var td; 

    //Calling the dates service 
    d3.json('/api/dates', function(error,data) { 
     var dates = data; 
     if(data != null){ 
     fd = new Date(data.start); 
     td = new Date(data.end); 
     var cnt = 0; 
     var startGraph = function(){ 
     if (fd > td) { 
      console.log(" start Date is greater than end Date"); 
      clearInterval(interval); 
      flag = true; 
      $('.wrapper').trigger('newPoint'); 
      return; 
     } 
     var fdt = fd.toISOString(); 
     var tdt = new Date(fd.setMinutes(fd.getMinutes() + 30)).toISOString(); 

     //Calling service to get the values for stacked area chart 
     d3.json("/api/service?start=" +fdt+ "&end=" +tdt, function(error,result) { 
      if(result != null){ 
       numbers = numbers.concat(flightInfo.numbers); 
       values[values.length] = flightInfo.values; 
      } 
     }); 
      cnt++; 
     } 
     function pushPoint(){ 
      var cnt=0; 
      var interval = setInterval(function(){ 
      if(cnt!=values.length) 
      { 
      tick(values[cnt]); 
      cnt++;} 
      else 
      clearInterval(interval); 
      },400);   
     } 

     //Calling the Processing Dates API to pull the data for area chart 
     var interval = setInterval(startGraph,10); 
     } 
    }); 

    $(document).ready(function() { 
    stackGraph(); // this is another js file 
    var cnt=0; 
    //Pushing new point 
     $('.wrapper').on('newPoint', function(){ 
     if(flag){ 
      if(cnt!=values.length){ 
      tick(values[cnt]); 
      cnt++; 
      } 
     } 
     }); 
    }); 
+0

Ich würde eine websocket implementieren, um die Daten gegeben werden, wenn es eine Änderung ist nicht anfordert (Polling) für die Daten, sind Sie sowohl eine Menge Last setzen auf dem Server und dem Client .. – Pogrindis

Antwort

0

Gibt es tatsächlich einen Zeilenumbruch auf der Zeile mit Ihrer Rücksendeanweisung hier?

$('.background').trigger('newPoint'); 
return //is there actually a line break here? 
setTimeout(startGraph,10); 

Wenn ja, werden Sie die nächste Zeile nicht ausführen.

Why doesn't a Javascript return statement work when the return value is on a new line?

+0

In Ihrem Snippet haben Sie 'return' und' setTimeout (startGraph, 10); ' in verschiedenen Zeilen. Sind beide von denen tatsächlich auf der gleichen Linie? –

+0

Nein, sie sind nicht, sie sind auf verschiedenen Linien – hhhh4

+0

Also, 'setTimeout (startGraph, 10)' wird nie aufgerufen werden. Ich vermute, was Sie tun möchten, ist: 'interval = setTimeout (startGraph, 10); return; ' Es sei denn, Sie möchten die Dinge nach 30 Minuten stoppen? –

Verwandte Themen