In this article I will show how you can abort a jQuery ajax request, preventing your user experience from disappearing into space.
Introduction
We have all done it – opened a page which runs an infinite loop consisting of some form of while(true). But no-one means to do that on purpose….That said there may be occasions where we are making requests to pages which we know are really really slow. Keeping a long connection open on the server restricts the number of open threads and potentially causes lockups. It is also a terrible user experience more importantly.
It might not be quite as relevant nowadays as it might have been to a Domino server say 10 years ago but still – pretty cool idea.
You can abort the ajax request with .abort()
Slowly loading XPage
I created a simple XPage with a before render response page which will take a long time to finish (as you can see below is ~30 seconds)
<xp:this.beforeRenderResponse> <![CDATA[#{javascript: for (var i=0; i<50000000; i++){ true; } return true} ]]> </xp:this.beforeRenderResponse>
Aborting the Ajax call
Aborting the call is relatively simple – by assigning a variable to the ajax call we can then just .abort() it
var temp = $.ajax({ url: 'http://copper.xomino.com/xomino/jQinX2.nsf/xRunForever.xsp' }).error(function(){ console.log('hey what happened') }) temp.abort()
Running it manually we can see this
But a more practical solution is to set a timeout function to test the ajax value and abort if it is taking too long. How long that is, is entirely up to you……
function dontRunForever(url, time){ var temp = $.ajax({ url: url, }).error(function(){ console.log('hey what happened'); }).success(function(){ console.log('All Done'); temp = false }) setTimeout(function(){ //Using function() inside the setTimeout means the function is executed after the "time" if(temp){ console.log('aborting') temp.abort() } else { console.log('ajax call completed in time') } }, time) } dontRunForever( 'http://copper.xomino.com/xomino/jQinX2.nsf/xRunForever.xsp', 5000)
So when we run this with a timeout of 5 seconds, we see the abort() trigger
But when we use 50 seconds we see a successful completion and no abort message – and eventually the end of the Timeout success message
This is all well and good – BUT…..
Just because the ajax request is aborted – this does not mean the task stops running on the server – this whole concept improves the user experience and nothing else. This will not stop a never ending task running on the server – only the server settings will truly kill that.
Conclusion
When I found this and the fact that it has been around for over 4 years I was somewhat annoyed that I did not know about it earlier, but it is pretty cool still all the same 🙂
Reblogged this on SutoCom Solutions.
I will trully need help with similar problem in Worpdress, the taksks are triegerd from AdForest theme which causes infinite request loading every second of an custom.js scrupt and i thin g after loading the page perticular lines that are loading in the requests are not necesarry. And I want to stop them atleast on user end point not to loading in the browser. I think 5 000 plus requests for one hour are too much ang are causing me HIG CPU overoload not on my hosting but on a high price VPS :O Which I never had problems, but this is a website of a clinet of myne.