I am working on client side scripts and need to do heavy computations like pushing huge number of objects in an array, it causes JavaScript to stop response and browser hangs gi
You should use WebWorkers
They are really supported and they are real threads in javascript as they spawn real OS threads!
main.js
var heavy_process = new Worker('heavy_process.js');
heavy_process.addEventListener('message', function(e) {
// Log the workers message.
console.log(e.data);
}, false);
heavy_process.postMessage();
for (var series = 0; series < chartObj.masterChart.series.length; series++) {
var detailData = [];
jQuery.each(chartObj.masterChart.series[series].data, function (i, point) {
if (point.x >= chartObj.RangeSelectedMinValue && point.x <= chartObj.RangeSelectedMaxValue) {
detailData.push({
x: point.x,
y: point.y
});
}
});
chartObj.detailChart.series[series].setData(detailData);
// you should use self.postMessage here !!!
}
Okay, looking at your code, there's a few things you can optimize:
var s = chartObj.masterChart.series, // #1
sLength = s.length, // #2
chartMin = chartObj.RangeSelectedMinValue,
chartMax = chartObj.RangeSelectedMaxValue;
for (var series = 0; series < sLength; series++) {
var detailData = [],
data = s[series].data, // #3
length = data.length; // #2
for(var i = 0; i < length; i++){ // #4
var point = data[i];
if (point.x >= chartMin && point.x <= chartMax) {
detailData.push({
x: point.x,
y: point.y
});
}
}
chartObj.detailChart.series[series].setData(detailData);
}
s[series].data
to a temp var. This provides a direct pointer to the data instead of having to access s[series].data
each iteration of the loop. Same principle as #1I'm not saying this edit will work miracles, but it should reduce the load a bit.
You could split it in to different "threads" by using timeouts. Like so:
var counter;
function longRun(start) {
counter = 0;
for (var i = start; i < 3000; i++) {
counter++;
console.log(i);
if (counter > 99) {
setTimeout(function() {
longRun(i+1)
}, 0);
console.log('counter at: ' + i + ' start fake "thread"');
return;
}
}
alert('Done!');
}
longRun(0);
jsFiddle example
I guess it would prevent the warning, but I don't know how sane it really is.