Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
68
rated 0 times [  69] [ 1]  / answers: 1 / hits: 26166  / 12 Years ago, wed, august 15, 2012, 12:00:00

I am doing an AJAX call to my webserver which fetches a lot of data. i show a loading image that spins while the ajax call is executed and then fades away.



the thing i have noticed is that all of the browsers on this particular call will make it non-responsive for about 7 seconds. That being said, the loading image is NOT spinning as what i had planned while the fetch was occurring.



I did not know if this was something that happens or if there is a way around to, in a sense cause there to be a fork() so that it does 1 thing, while my loading icon still spins.



THoughts? Ideas?



below is the code as someone wanted to see it:



$(div.loadingImage).fadeIn(500);//.show();
setTimeout(function(){
$.ajax({
type: POST,
url: WEBSERVICE_URL + /getChildrenFromTelTree,
dataType: json,
async: true,
contentType: application/json,
data: JSON.stringify({
pText: parentText,
pValue: parentValue,
pr_id: LOGGED_IN_PR_ID,
query_input: $(#queryInput).val()
}),
success: function (result, textStatus, jqXHR) {
//alert(winning);
//var childNodes = eval(result[getChildrenFromTelTreeResult]);
if (result.getChildrenFromTelTreeResult == ) {
alert(No Children);
} else {
var childNodes = JSON.parse(result.getChildrenFromTelTreeResult);
var newChild;
//alert('pText: '+parentText+npValue: +parentValue+nPorofileID: + LOGGED_IN_PR_ID+nnFilter Input; +$(#queryInput).val() );
//alert(childNodes.length);
for (var i = 0; i < childNodes.length; i++) {
TV.trackChanges();
newChild = new Telerik.Web.UI.RadTreeNode();
newChild.set_text(childNodes[i].pText);
newChild.set_value(childNodes[i].pValue);
//confirmed that newChild is set to ServerSide through debug and get_expandMode();
parentNode.get_nodes().add(newChild);
TV.commitChanges();
var parts = childNodes[i].pValue.split(,);
if (parts[0] != {fe_id} && parts[0] != {un_fe_id}) {
newChild.set_expandMode(Telerik.Web.UI.TreeNodeExpandMode.ServerSide);
}
}
}
//TV.expand();
//recurseStart(TV);
},
error: function (xhr, status, message) {
alert(errrrrror);
}
}).always(function () {
$(div.loadingImage).fadeOut();
});
},500);


A corworker of mine noticed this issue, and suggested i add a setTimeout(function(){..},500); but it does not fix the issue at hand, so it will most likely be removed.


More From » jquery

 Answers
11

Since JavaScript is single threaded, a lot of sync processing will hang up the event queue and prevent other code from executing. In your case, it's the for-loop thats locking up the browser while it's executing.


What you can try is putting all your iterations into your event queue.



for (var i = 0 ; i < childNodes.length ; i = i + 1) {
(function(i) {
setTimeout(function(i) {
// code-here
}, 0)
})(i)
}


This should space out the processing and not force the browser to finish them all at once. The self executing function is there to create a closure to hold on to the value of the loop counter i.


[#83618] Tuesday, August 14, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
bradleymoisesy

Total Points: 121
Total Questions: 105
Total Answers: 95

Location: Nepal
Member since Mon, Jan 4, 2021
3 Years ago
bradleymoisesy questions
Wed, Dec 22, 21, 00:00, 2 Years ago
Tue, Jun 1, 21, 00:00, 3 Years ago
Thu, Jun 11, 20, 00:00, 4 Years ago
Thu, Jan 16, 20, 00:00, 4 Years ago
;