So I put together a function that made an ajax call (home rolled no libraries as I wanted to keep it small) but that also ran setTimeout() so that could set the threshold I wanted for a response 100, 200, 500 2000 milliseconds etc rather than simply having to wait for the request to timeout or respond with an error code.
Either when the ajax returns or the timeout hits a callback is triggered and passed either the ajax response status (200 for good, 404 for not found etc) or a simple null value followed by the request object (if not null).
This code is called by a function that specifies a URL to hit, a timeout for getting a response and a callback to send the response to - In my code, the call back is set to update a global scope flag with the pulse value and then uses a timeout to kick the whole process off again in 30 seconds so the web page is not hammering the server.
// Server Heartbeat Checker
function heartbeat(url, ttl, callback) {
// Confirms active connection to server by custom URL response
//
if (!url) {
url = "http://www.yourwebsitehere.com/yourpage?someheartbeatcall";
// Replace with specific server heartbeat location and query string for cache busting
}
if (!ttl) {
ttl = 1000; // Custom timeout in milliseconds
// Replace with specific server heartbeat location and query string for cache busting
}
// Create the Ajax object
var ajaxRequest;
try{
ajaxRequest = new XMLHttpRequest();
}
catch (e){
// Internet Explorer Browsers
try{
ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try{
ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e){
// Unable to create
callback(null);
return;
}
}
}
// Set flag so only one pulse is recorded
var called = false;
// Make ajax call
ajaxRequest.onreadystatechange = function(){
if(ajaxRequest.readyState == 4){
if (!called) {
called = true;
callback(ajaxRequest.status, ajaxRequest);
}
}
}
ajaxRequest.open("GET", url, true);
ajaxRequest.send(null);
// Make ttl timeout call
var ttlcatch = setTimeout(function(){
if (!called) {
called = true;
callback(null);
}
}, ttl);
return;
}
var foo = false;
heartbeat("http://www.google.com", 1000, function(pulse){foo = pulse; alert(pulse);} )
No comments:
Post a Comment