From f8137dcb13ec9b998faee20c2269adb2ed6f634d Mon Sep 17 00:00:00 2001 From: Tristan Hume Date: Wed, 20 Apr 2016 16:20:30 -0400 Subject: [PATCH] Sequence numbers for requests --- public/script/main.js | 50 ++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/public/script/main.js b/public/script/main.js index 6c3af5f..bd3e2f1 100644 --- a/public/script/main.js +++ b/public/script/main.js @@ -8,7 +8,9 @@ var reqCorrelationQuery = null; var curRecords = null; var curOverlay = null; -var inFlightRequest = null; +var nextSeqNum = 1; +var displayingSeqNum = 0; + // http://stackoverflow.com/questions/149055/how-can-i-format-numbers-as-money-in-javascript Number.prototype.formatNice = function(c, d, t){ @@ -308,7 +310,11 @@ function clearCorr() { // ==== Fetching requested data -function handleNewData(oEvent) { +function handleNewData(oEvent, seqNum) { + // ignore out of order responses + if(seqNum <= displayingSeqNum) return; + displayingSeqNum = seqNum; + var arrayBuffer = oEvent.target.response; // Note: not oReq.responseText if (arrayBuffer) { curRecords = readBtsfFile(arrayBuffer); @@ -316,41 +322,31 @@ function handleNewData(oEvent) { } else { console.log("Couldn't fetch file " + url); } - - // TODO: maybe instead of cancelling in flight requests when new ones are sent out - // perhaps we can just always prefer results from requests that were *sent* more recently - // even if they arrive earlier due to weird networking things. - inFlightRequest = null; } -function fetchCorrelationData(corrBuffer, filter) { - if(inFlightRequest !== null) inFlightRequest.abort(); - var xhr = new XMLHttpRequest(); - xhr.open("POST", "/find?"+encodeURIComponent(filter), true); - xhr.responseType = "arraybuffer"; - xhr.onload = handleNewData; - xhr.send(new DataView(corrBuffer)); - inFlightRequest = xhr; -} +function fetchData(filter, corrBuffer) { + var thisRequest = nextSeqNum; + nextSeqNum += 1; -function fetchRawData(filter) { - if(inFlightRequest !== null) inFlightRequest.abort(); var xhr = new XMLHttpRequest(); - xhr.open("GET", "/raw?"+encodeURIComponent(filter), true); + var endpoint = (corrBuffer !== null) ? "/find?" : "/raw?"; + xhr.open("POST", endpoint+encodeURIComponent(filter), true); xhr.responseType = "arraybuffer"; - xhr.onload = handleNewData; - xhr.send(null); - inFlightRequest = xhr; -} + xhr.onload = function(oEvent) { + handleNewData(oEvent, thisRequest); + } -function updateFromServer() { - if(reqCorrelationQuery !== null) { - fetchCorrelationData(reqCorrelationQuery, reqFilter); + if(corrBuffer !== null) { + xhr.send(new DataView(corrBuffer)); } else { - fetchRawData(reqFilter); + xhr.send(null); } } +function updateFromServer() { + fetchData(reqFilter, reqCorrelationQuery); +} + function init() { updateFromServer(); document.getElementById("filter-box").focus();