Итак, моя цель - нарисовать некоторые показатели в реальном времени, которые хранятся в базовой системе. У меня есть базовая коллекция, в которой хранятся показатели, она обновляется каждую секунду, когда я просматриваю сервер 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, но при каждом обратном вызове он ТОЛЬКО отображает исходные данные, хранящиеся в «самых последних данных». Я могу подтвердить, что самые последние данные действительно обновляются в самой базовой сети, но ссылка, передаваемая кубизму, не обновляется при каждом обратном вызове. Когда я регистрирую «самые последние данные» в коде кубизма, он никогда не обновляется до последнего значения.
Является ли это проблемой закрытия? Я пропустил синтаксис кубизма для опроса новых данных? Или мне нужно передать ссылку на базовую коллекцию по-разному? Любые подсказки были бы очень полезными. Спасибо.