javascript - d3js 图表更新由 websocket 消息触发

标签 javascript d3.js websocket autobahn

在 Python 中运行高速公路 Websocket 服务器并在 html 前端获取 json 更新。当消息到达时,该值(在本例中为“temp”)将通过innerHTML 显示为数字,并且该部分工作正常。

我们还得到了一个表盘图(d3js),但更新是由代码末尾的 setInterval 函数发起的,这远非理想。如何通过 websocket 使仪表更新“onmessage”?

enter image description here

<script type="text/javascript">

//---the websocket part--
var sock = null;
var displaynumber = null;
var tempdata = null;

window.onload = function () {
  var wsuri;
  displaynumber = document.getElementById('disp');

  if (window.location.protocol === "file:") {
    wsuri = "ws://...:9000";
  } else {
    wsuri = "ws://" + window.location.hostname + ":9000";
  }

  //set up a new websocket
  if ("WebSocket" in window) {
      sock = new WebSocket(wsuri);
  } else if ("MozWebSocket" in window) {
      sock = new MozWebSocket(wsuri);
  } else {
      disp("Browser does not support WebSocket!");
               window.location = "http://autobahn.ws/unsupportedbrowser";
  }

  if (sock) {
    //sock.onopen = function() {};

    sock.onclose = function(e) {
      sock = null;
    };

    sock.onmessage = function(e) {
      // e.data will be sent as a string and need to be converted to object
      var jsondata = JSON.parse(e.data);
      tempdata = jsondata.temp;
      disp(tempdata + " C");
    };
  }

  function disp(m) {
    displaynumber.innerHTML = m;
  }


  //----This is the dial chart part

  dialChart();

  function dialChart() {
    var powerGauge = gauge('#power-gauge', {
      size: 300,
      clipWidth: 300,
      clipHeight: 300,
      ringWidth: 60,
      minValue: 0,
      maxValue: 100,
      transitionMs: 1000,
    });

    powerGauge.render();

    function updateReadings() {
      powerGauge.update(tempdata);
    }

    updateReadings();
    setInterval(function() {
      updateReadings();
    }, 2 * 1000);
  }
}

</script>

最佳答案

dialChart定义的末尾,添加return powerGauge。然后,当您调用 dialChart(); 时,将结果保存到变量中。然后,不要在套接字回调中写入 tempdata,而是调用 powerGaugeVariable.update(jsondata.temp)

关于javascript - d3js 图表更新由 websocket 消息触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34578507/

相关文章:

javascript - 如何在声明 WebSocket HTML5 时发送参数

javascript - 如何找到特定的 html 元素,AngularJS, Protractor

javascript - 如何在D3js中为不同的图表显示不同的标题?

java - Websocket:发送超过 65535 字节的消息失败

d3.js - 对象不支持属性或方法 'map'

d3.js - dc.js 带复选框的多选菜单

python - 在tornadoweb websockets服务器中实现SSL

javascript - <video> 和 onloadedmetadata-event

c# - 在 javascript 计时器完成后调用服务器端 sub

javascript - 烙印文本动画效果不佳