Skip to content

Instantly share code, notes, and snippets.

@idmontie
Created September 14, 2015 03:39
Show Gist options
  • Save idmontie/d20782eb5f99de48aba4 to your computer and use it in GitHub Desktop.
Save idmontie/d20782eb5f99de48aba4 to your computer and use it in GitHub Desktop.
Long Polling for jQuery
/* Long Polling
*
* By: Ivan Montiel
*/
jQuery.poll = function (options, poll) {
if ( poll == null || poll === undefined) {
poll = {};
}
if ( (typeof options) == "string") {
options = {command : options};
}
var defaults = {
prevDataLength : 0,
nextLine : 0,
http : null,
pollTimer : null,
command : "poll",
url : "",
data : "",
update : null,
stop : false
};
var createRequestObject = function () {
if (window.XMLHttpRequest) {
defaults.http = new XMLHttpRequest();
} else {
defaults.http = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!defaults.http)
debug("Couldn't start XMLHttpRequest object");
};
var handleResponse = function () {
if (defaults.http.readyState != 4 && defaults.http.readyState != 3)
return;
if (defaults.http.readyState == 3 && defaults.http.status != 200) {
return;
clearInterval(defaults.pollTimer);
defaults.inProgress = false;
}
// In konqueror http.responseText is sometimes null here...
if (defaults.http.responseText === null)
return;
while (defaults.prevDataLength != defaults.http.responseText.length && !defaults.stop) {
if (defaults.http.readyState == 4 && defaults.prevDataLength == defaults.http.responseText.length)
break;
defaults.prevDataLength = defaults.http.responseText.length;
var response = defaults.http.responseText.substring(defaults.nextLine);
var lines = response.split('\n');
defaults.nextLine = defaults.nextLine + response.lastIndexOf('\n') + 1;
if (response[response.length-1] != '\n')
lines.pop();
for (var i = 0; i < lines.length; i++) {
defaults.update(lines[i]);
}
}
if ( defaults.stop) {
defaults.http.abort();
clearInterval(defaults.pollTimer);
}
if ((defaults.http.readyState == 4 && defaults.prevDataLength == defaults.http.responseText.length))
clearInterval(defaults.pollTimer);
defaults.inProgress = false;
};
var startProcess = function () {
createRequestObject();
var appendData = "";
if (defaults.data) {
appendData = "?" + defaults.data;
}
defaults.http.open('get', defaults.url + appendData);
defaults.http.onreadystatechange = handleResponse;
defaults.http.send(null);
defaults.pollTimer = setInterval(handleResponse, 1000);
};
var options = $.extend(defaults, options);
if ( defaults.command == "poll") {
startProcess();
}
else if (defaults.command == "stop") {
poll.stop = true;
}
return defaults;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment