I am trying to stream data via a websocket & display it in dataTable. I am able to get data in my client but no data is actually getting displayed in the table.
How can I display the updated data inplace in realtime in the dataTables as soon as the websocket data is streamed.
<script type="text/javascript" charset="utf-8">
streamData = ""
streamDataArr = new Array();
$(document).ready(function() {
namespace = 'http://localhost:8080/';
var socket = io(namespace);
socket.on('connect', function() {
socket.emit('my_event', {data: 'connected to the SocketServer...'});
});
socket.on('my_response', function(msg, cb) {
streamData = JSON.parse(msg.data);
$('#log').append('<br>' + $('<div/>').text('logs message :- ' + JSON.stringify(streamData)).html());
streamDataArr.push([streamData.instrument_token, streamData.last_price, streamData.ohlc.open])
console.log(streamDataArr); //value is present
});
});
$(document).ready(function()
{
alert("Arr:- ",streamDataArr) //empty why ?
alert("soemthing", streamDataArr[0]) //empty why ?
var table = $('#example').DataTable(
{
data: streamDataArr,
columns: [
{ title: "Name" },
{ title: "last price" },
{ title: "Open price" },
]
}
);
});
</script>
<body>
<table id="example" class="display" style="width:100%"> </table>
</body>
P.S. i am new to datatable & socket-io
Edit:- v2 of the code.
<script type="text/javascript" charset="utf-8">
streamData = ""
streamDataArr = new Array();
function fillDataTable(dataSet){
{
if (document.readyState === "complete"){
//alert("Arr:- ",dataSet) //empty why ?
//alert("soemthing", dataSet[0]) //empty why ?
var table = $('#example').DataTable(
{
data: dataSet,
retrieve: true,
deferRender: true,
searching: false,
paging: false,
columns: [
{ title: "stock Name" },
{ title: "stock last price" },
{ title: "stock Open price" },
]
});
}
}
}
namespace = 'http://localhost:8080/';
var socket = io(namespace);
socket.on('my_response', function(msg, cb) {
streamData = JSON.parse(msg.data);
$('#log').append('<br>' + $('<div/>').text('logs message :- ' + JSON.stringify(streamData)).html());
streamDataArr.push([streamData.instrument_token, streamData.last_price, streamData.ohlc.open])
console.log(streamDataArr); //value is present
fillDataTable(streamDataArr);
$('#example').DataTable().row.add( [streamData.instrument_token, streamData.last_price, streamData.ohlc.open] ).draw();
redraw();
// $('#example').DataTable().row(streamData.instrument_token).data("stock last price") = streamData.last_price
// $('#example').DataTable().row(streamData.instrument_token).data("stock Open price") = streamData.ohlc.open
});
function redraw(){
var table = $('#example').DataTable();
var index = table.column( 0 ).data().indexOf( streamData.instrument_token );
if (index != ""){
alert("index is", String(index))
console.log(String(index))
$('#example').DataTable().row(index).data( [streamData.instrument_token, streamData.last_price, streamData.ohlc.open] ).draw();
}
}
</script>
By this the 1 entry is appearing twice, I cant really test, whether it updates in place as the source websocket is down
v3 version. By this the data is streaming but I am having duplicate entries as shown in the pic. I also noticed that it is replacing entries with other stocks.
<script type="text/javascript" charset="utf-8">
$(document).ready(function () {
var table;
// a dummy initial row for testing:
var dataSet = [ ];
$(document).ready(function () {
table = $('#example').DataTable({
data: dataSet,
columns: [
{title: "Symbol", data: "instrument_token"},
{title: "StockName", data: "stockName"},
{title: "last_price", data: "last_price"},
{title: "ohlcOpen", data: "ohlc.open"}
]
});
});
// small helper function for selecting element by id
let id = id => document.getElementById(id);
//Establish the WebSocket connection and set up event handlers
let ws = io.connect(null, {port: 8000, rememberTransport: false});
ws.on('my_response', function(msg, cb) {
updateTable(msg);
});
//ws.onmessage = msg => updateTable(msg);
ws.onclose = () => alert("WebSocket connection closed");
function updateTable(message) {
let stockData = JSON.parse(message.data);
console.log("in updateTable stock data:-", stockData)
// check if symbol already in table:
var index = table.column( 0 ).data().indexOf( stockData.instrument_token );
if (index >= 0) {
// update the existing row:
table.row( index ).data( stockData ).draw();
} else {
// insert a new row:
table.row.add( stockData ).draw();
}
}
});
</script>

