【问题标题】:Highcharts not Drawing point on setIntervalHighcharts 不在 setInterval 上绘制点
【发布时间】:2015-04-20 19:25:01
【问题描述】:

我在后端每 30 秒将数据放在一个 api 上。在前端,我使用 highcharts 来可视化数据,并使用 setInterval 设置每 30 秒检索一次新数据。我的问题是,在那个 setInterval 上,折线图消失或没有绘制到下一个新点。有人现在为什么会这样吗?

小提琴:http://jsfiddle.net/b8tf281n/3/

代码:

chart1 = {
    yAxisMin: 40,
    yAxisMax: 100
};
// empty objects for our data and to create chart
seriesData = [];
BPM = [];
time1 = [];

// console.log(chart1.data.series);

$(function () {
    $(document).ready(function () {
        Highcharts.setOptions({
            global: {
                useUTC: false
            }
        });



        var url = 'http://msbandhealth.azurewebsites.net/odata/PulsesAPI/';
        $.ajax({
            url: url,
            dataType: 'json',
            context: seriesData,
            success: function (data) {



                // structure our data 
                for (var i = 0; i < data.value.length; i++) {
                    bpm = data.value[i].BPM;
                    time = data.value[i].Time;
                    BPM.push({
                        x: moment(time),
                        y: bpm
                    });
                    // console.log(BPM);
                    time1.push(time);
                }
                console.log((new Date).getTime());
                console.log(moment(time, "DD.MM.YYYY hh:mm:ss"));
                console.log(BPM);
                console.log(BPM[BPM.length - 1]);
                // console.log(seriesData);

                // set our data series and create new chart
                chart1.data.series[0].data = BPM;

                chart = new Highcharts.Chart(chart1.data);
                $('#container').css({
                    height: '400px'
                });


                // console.log(sortedBPM);


                // console.log(time1);

            }

        });




        // give highcharts something to render to
        var container = document.getElementById("container");

        chart1.data = {

            chart: {
                renderTo: container,
                type: 'spline',
                animation: Highcharts.svg, // don't animate in old IE
                marginRight: 10,
                events: {
                    load: function () {
                        setInterval(function () {

                            // find last data points
                            var test = BPM[BPM.length - 1];
                            var x = (new Date).getTime(),
                                y = test.y;
                            console.log(x);

                            shift = chart.series[0].data.length < 30;
                            chart.series[0].addPoint([x, y], true, true);




                        },
                        30000);
                    }
                }

            },
            title: {
                text: 'Microsoft Band: Real Time Pulse Analysis'
            },
            xAxis: {
                type: 'datetime',
                tickPixelInterval: 150,
                dateTimeLabelFormats: {


                },
            },
            yAxis: {
                min: chart1.yAxisMin,
                max: chart1.yAxisMax,
                title: {
                    text: 'Heart Rate'
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#808080'
                }]
            },
            tooltip: {
                formatter: function () {
                    return '<b>' + this.series.name + '</b><br/>' + Highcharts.dateFormat('%H:%M:%S', this.x) + '<br/>' + Highcharts.numberFormat(this.y, 2);
                }
            },
            legend: {
                enabled: false
            },
            exporting: {
                enabled: false
            },
            series: [{
                name: 'Beats Per Minute',
                data: []
            }]


        };

    });
});

【问题讨论】:

  • 我也尝试将间隔更改为超过 30 秒,结果相同
  • 我已经研究过他们的 api,尤其是 addPoint 部分。不过谢谢。
  • hmmmm 创建一个新函数来暂停/停止 setInterval 上的动画,直到准备好下一个

标签: javascript jquery json highcharts


【解决方案1】:

您的 test.y 是问题所在。它在一个时间间隔后返回 undefined。不知何故 BPM 正在改变它的结构 - 将每个对象从 {x,y} 更改为 [0,1] - 因此我使用了:

 y = (test.y !== undefined)? test.y : test[1];

获取以前的结构或新的结构。我还将间隔设置为 3 秒,以便您更轻松地看到差异。这是DEMO

【讨论】:

  • 如果test.y = 0 怎么办?我认为您应该检查 test.y 是否未定义。
  • @RaeenHashemi 你的回答让我意识到了一些事情......我很确定 BPM 只在加载时的 ajax 调用中更新一次。之后它没有更新,这可能是为什么当我引用该区域的最后一个索引时它返回未定义或相同点的原因。你的演示看起来很棒。问题是,如果发送数据的设备处于开启状态,api 只会每 30 秒更新一次。此时设备未开启,您的演示仍在更新。你跟吗?所以我想知道我是否应该在设置间隔函数中放置另一个 ajax 调用?那会杀死浏览器吗?谢谢
  • 是的,BPM 自 ajax 调用以来更新一次,但 addPoint 函数以我不知道的方式在每个时间间隔更新 BPM。关于 30 秒的部分,我实际上并没有遵循,但是每 30 秒调用一次 ajax 也不会那么糟糕。
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多