2013-11-01 1 views
1

Итак, моя цель - нарисовать некоторые показатели в реальном времени, которые хранятся в базовой системе. У меня есть базовая коллекция, в которой хранятся показатели, она обновляется каждую секунду, когда я просматриваю сервер backend. Моя коллекция имеет массив исторических метрик и поле «самые последние данные», которые являются последними данными, поступающими из бэкэнд. Каждая секунда «самые последние данные» обновляется до другого значения. Я передаю ссылку на базовую коллекцию на функцию, которая создает метрики кубизма.Кубизм не строит обновленные данные по обратным вызовам

Когда визуализируется представление, содержащее представление Cubism.js, оно должно выполнять историческую загрузку всех точек данных в хранимой в коллекции диаграмме горизонта. Это та часть, в которой я добился успеха. Однако, когда функция метрики выполняет обратный вызов, она не выводит новые/правильные точки из поля «самые последние данные», которое обновляется каждую секунду.

Вот мой код, который взаимодействует с DOM (я не верю, что эта часть вызывает проблемы):

 var context = cubism.context() 
      .serverDelay(0) 
      .clientDelay(0) 
      .step(250) 
      .size(1116); 


     //Getting the metrics from the backbone collection 
     var models = this.dataSet.models; 
     console.log('models in metric view',models); 
     //aggregate 'metrics'. Each component has a 'metric' which contains its stats over time 
     for(model in models){ 
      var attributes = models[model].attributes; 

      if(!attributes['name'] || attributes['type']== "FLOW" || attributes['type'] == "SERVER"){ 
       continue; 
      } 
      if(attributes['name'] == null){ 
       continue; 
      } 
      var name = attributes['name']; 
      var type = attributes['type']; 
      var serverName = attributes['serverName']; 
      var metName = name.concat(serverName); 
      console.log(metName); 

      //Getting the cubism metric for each stat in the backbone collection 
      //Passing in a reference to the current model in the backbone collection (this.dataSet.models[model]) 
      var curContext = getMetric(metName, this.dataSet.models[model]); 

      statsList.push(curContext); 

     } 

     d3.select(this.loc).selectAll(".axis") 
      .data(["top", "bottom"]) 
      .enter().append("div") 
      .attr("class", function(d) { return d + " axis"; }) 
      .each(function(d) { d3.select(this).call(context.axis().ticks(12).orient(d)); }); 

     //create rule 
     d3.select(this.loc).append("div") 
      .style("position", "fixed") 
      .style("top", 0) 
      .style("bottom", 0) 
      .style("width", "1px") 
      .style("pointer-events", "none") 
      .call(context.rule()); 

     d3.select(this.loc).selectAll(".horizon") 
      .data(statsList) 
      .enter().insert("div", ".bottom") 
      .attr("class", "horizon") 
      .call(context.horizon().height(35)); 

Это существенно перебирая все статы в коллекции позвоночника, то вызов «getMetric ', передавая ссылку на текущий stat в основной структуре. 'getMetric' возвращает метрику кубизма.

Вот код, который обрабатывает каждую метрику (вероятно, причиной проблемы):

 /* Keep a map of intialized metrics 
     When the visualization is initialized, we load the historical data which is in the 
     'attributes' field of the model. The model is an individual set metrics */ 

     var initializedMetrics = {}; 
     function getMetric(name, model){ 
      var format = d3.time.format("%I-%M-%S"); 
      return context.metric(function(start, stop, step, callback){ 
       var statValues = []; 

       if(initializedMetrics[name]){ 
        /* If the metric has already been initialized and we loaded the historical data 
        from 'attributes' field, plot the newest data which is stored in 'most-recent-data' 
        This field should be updated every second on every API call to the server */ 
        while(start<stop){ 
         start+=step; 
         console.log(model.attributes['most-recent-data']['rate']); 
         statValues.push(model.attributes['most-recent-data']['rate']); 
        } 

       } else{ 
        /* Metric has not been initalized, so we load all the historical data in 'all-data' 
        for this stat and plot it over time*/ 
        initializedMetrics[name]=true; 

        var lookup = {}, 
        i = start.getTime(); 
        //console.log('startTime', i); 
        var curStat = null; 
        var metricData = model.attributes['all-data'] 
        for(stat in metricData){ 
         curStat = metricData[stat]; 
         //console.log(name, curStat); 
         var curDate = new Date(curStat['timeStamp']); 
         curDate = format(curDate); 
         lookup[curDate] = curStat; 
        } 
        var lastValue; 
        while((i+=step) < stop){ 
         start+=step; 
         var key = format(new Date(i)); 
         if(key in lookup){ 
          lastValue = lookup[key]['valueLong']; 
         } 
         var curVal = key in lookup ? lookup[key]['valueLong'] : lastValue; 
         //console.log(name,curVal); 
         statValues.push(curVal); 
        } 
       } 
       /* Callback with statValues*/ 
       callback(null,statValues); 
       }, name); 
     } 

Я с успехом загрузив все исторические данные (все внутри еще кронштейне). Однако, когда инициализируется метрика, я пытаюсь загрузить новые данные, которые хранятся «самые последние данные». Это поле обновляется каждую секунду с помощью вызовов API, но при каждом обратном вызове он ТОЛЬКО отображает исходные данные, хранящиеся в «самых последних данных». Я могу подтвердить, что самые последние данные действительно обновляются в самой базовой сети, но ссылка, передаваемая кубизму, не обновляется при каждом обратном вызове. Когда я регистрирую «самые последние данные» в коде кубизма, он никогда не обновляется до последнего значения.

Является ли это проблемой закрытия? Я пропустил синтаксис кубизма для опроса новых данных? Или мне нужно передать ссылку на базовую коллекцию по-разному? Любые подсказки были бы очень полезными. Спасибо.

ответ

0

Найдено решение. Вместо объединения новых данных в базовую коллекцию я перезагружал ее и добавлял каждую точку данных снова. Это означало, что модели, которые я первоначально перешел в кубизм, были не такими, как те, которые были обновлены. Проблема была устранена путем объединения коллекции после каждого вызова на сервер, а не сброса.

Смежные вопросы