Javascript 从服务器实时更新图形

Javascript 从服务器实时更新图形,javascript,jquery,graph,d3.js,data-visualization,Javascript,Jquery,Graph,D3.js,Data Visualization,我试图用接收到的数据更新一个图表,这样当通过websocket从服务器接收到更多数据时,条的高度就会增加。但我的代码不会在浏览器中渲染图形并绘制数据点。我看不出代码有什么问题。我真的需要一些帮助 ws = new WebSocket("ws://localhost:8888/dh"); var useData = [] //var chart; var chart = d3.select("body") .append("svg:svg") .attr("

我试图用接收到的数据更新一个图表,这样当通过websocket从服务器接收到更多数据时,条的高度就会增加。但我的代码不会在浏览器中渲染图形并绘制数据点。我看不出代码有什么问题。我真的需要一些帮助

  ws = new WebSocket("ws://localhost:8888/dh");

  var useData = []
  //var chart;

  var chart = d3.select("body")
     .append("svg:svg")
     .attr("class", "chart")
     .attr("width", 420)
     .attr("height", 200);


  ws.onmessage = function(evt)
  {  
    var distances = JSON.parse(evt.data);
    data  = distances.miles;
    console.log(data);

    if(useData.length <= 10){
      useData.push(data)
    }
    else
    {

       var draw = function(data){        
       // Set the width relative to max data value
       var x = d3.scale.linear()
        .domain([0, d3.max(useData)])
        .range([0, 420]);

       var y = d3.scale.ordinal()
        .domain(useData)
        .rangeBands([0, 120]);

       var rect = chart.selectAll("rect")
        .data(useData)

        // enter rect
        rect.enter().append("svg:rect")
            .attr("y", y)
            .attr("width", x)
            .attr("height", y.rangeBand());

        // update rect            
        rect
            .attr("y", y)
            .attr("width", x)
            .attr("height", y.rangeBand());

       var text = chart.selectAll("text")
            .data(useData)

       // enter text
       text.enter().append("svg:text")
            .attr("x", x)
            .attr("y", function (d) { return y(d) + y.rangeBand() / 2; })
            .attr("dx", -3) // padding-right
            .attr("dy", ".35em") // vertical-align: middle
            .attr("text-anchor", "end") // text-align: right
            .text(String);

        // update text
        text
            .data(useData)
            .attr("x", x)
            .text(String);
    }
draw();
useData.length = 0;
   }          
}                 
ws=newwebsocket(“ws://localhost:8888/dh”);
var useData=[]
//var图;
var图表=d3.选择(“主体”)
.append(“svg:svg”)
.attr(“类别”、“图表”)
.attr(“宽度”,420)
.attr(“高度”,200);
ws.onmessage=函数(evt)
{  
var distance=JSON.parse(evt.data);
数据=距离。英里;
控制台日志(数据);

如果(useData.length似乎没有表达式将新数据与上一次迭代中的旧数据进行聚合。
useData.length=0
彻底清除现有数据并
useData.push(数据)
仅将单个元素推送到空的
useData
数组上。我猜这不会生成需要打印的格式的数据

另外,我可能在这里遗漏了一些东西,但是似乎没有理由将
draw()
函数放在
ws.onmessage
处理程序内部。通过在处理程序外部定义
draw()
,它被定义一次,而不是每次触发
ws.onmessage
时都被重新定义

如果我是对的,那么代码只需要稍微重新排列一下,再加上一个大大简化的
ws.onmessage
处理程序中的一个小循环,以将新里程与旧里程相加:

var ws = new WebSocket("ws://localhost:8888/dh");
var useData = [12,45,48,45,654,12,465,5,12,45];
var chart = d3.select("body").append("svg:svg").attr("class", "chart").attr("width", 420).attr("height", 200);

function draw() {
    // Set the width relative to max data value
    var x = d3.scale.linear().domain([0, d3.max(useData)]).range([0, 420]);
    var y = d3.scale.ordinal().domain(useData).rangeBands([0, 120]);
    var rect = chart.selectAll("rect").data(useData);
    // enter rect
    rect.enter().append("svg:rect").attr("y", y).attr("width", x).attr("height", y.rangeBand());
    // update rect            
    rect.attr("y", y).attr("width", x).attr("height", y.rangeBand());
    var text = chart.selectAll("text").data(useData);
    // enter text
    text.enter().append("svg:text").attr("x", x).attr("y", function(d) {
        return y(d) + y.rangeBand() / 2;
    }).attr("dx", -3) // padding-right
      .attr("dy", ".35em") // vertical-align: middle
      .attr("text-anchor", "end") // text-align: right
      .text(String);
    // update text
    text.data(useData).attr("x", x).text(String);
};

draw();//initialise with hard-coded useData

//Now, aggregate additional miles when ws.onmessage fires and redraw the graph.
ws.onmessage = function(evt) {
    var distances = JSON.parse(evt.data);
    for(var i=0; i<useData.length; i++) {
        if(useData[i] && distances.miles[i]) {//safety
            useData[i] += distances.miles[i];//add the new miles to the total from previous iteration
        }
    }
    draw();//redraw the graph
}
var-ws=new-WebSocket(“ws://localhost:8888/dh”);
var useData=[12,45,48,45654,12465,5,12,45];
var chart=d3.select(“body”).append(“svg:svg”).attr(“class”,“chart”).attr(“width”,420).attr(“height”,200);
函数绘图(){
//设置相对于最大数据值的宽度
var x=d3.scale.linear().domain([0,d3.max(useData)]).range([0420]);
var y=d3.scale.ordinal().domain(useData).rangeBands([0120]);
var rect=chart.selectAll(“rect”).data(useData);
//输入rect
rect.enter().append(“svg:rect”).attr(“y”,y).attr(“width”,x).attr(“height”,y.rangeBand());
//更新矩形
rect.attr(“y”,y).attr(“width”,x).attr(“height”,y.rangeBand());
变量文本=图表。选择全部(“文本”)。数据(使用数据);
//输入文本
text.enter().append(“svg:text”).attr(“x”,x).attr(“y”,函数(d){
返回y(d)+y.rangeBand()/2;
}).attr(“dx”,-3)//右填充
.attr(“dy”,“.35em”)//垂直对齐:中间对齐
.attr(“文本定位”,“结束”)//文本对齐:右
.文本(字符串);
//更新文本
text.data(useData).attr(“x”,x).text(字符串);
};
draw();//使用硬编码的useData初始化
//现在,当ws.onmessage触发并重新绘制图表时,聚合额外的英里数。
ws.onmessage=函数(evt){
var distance=JSON.parse(evt.data);

对于(var i=0;我几乎想投票支持close,因为“太本地化了”,因为那里有太多的自定义函数和其他东西,但是消息到达了吗?你能在console.log中看到它吗?如果是这样的话,问题是浏览器的输出有问题,如果没有记录任何内容或发生错误,你应该在控制台中看到它?而且,它看起来不像你在调用
draw()
function anywhere,这可以解释为什么没有绘图?您是否调用该绘图()函数在其他地方,或者根本没有?我会把这个函数放在if/else逻辑之外,在else部分调用它,如果那是它应该被调用的地方,我假设它需要一些数据作为参数,就像这样??我真的不知道?你用数组和d3来填充图形,我对它不是很熟悉这就是解决方案。你应该试着把它作为一个新问题来提问,并尝试在标题中加入你正在使用的技术,以便吸引任何有这方面经验的人的注意力。通常工作日提问比较好,因为那时似乎有更多的人。