I am trying to optimize some of my JS long tasks.
Using webworker is a good way but webworker can’t handle DOM. So I am thinking about using setTimeout to do this.
Looks it work great. But this setTimeout a good way to do this job? Is there any modern technologies to postpone some function calls?
Original code:
var time = 0;
window.setInterval(function () {
time++;
$('#timer').html(time);
}, 100);
$('#reset').on('click', function () {
$('#output').empty();
time = 0;
});
$('#button1').on('click', function () {
var result;
for (var i = 0; i < 1e9; i++) {
result = i;
}
$('#output').html('Done! Counted to ' + result);
});
$('#button2').on('click', function () {
var blob = new Blob(
Array.prototype.map.call(
document.querySelectorAll('script[type="text/js-worker"]'),
function (oScript) { return oScript.textContent; }
),
{ type: 'text/javascript' }
);
// Create a new worker containing all "text/js-worker" scripts.
var worker = new Worker(window.URL.createObjectURL(blob));
// Listen for a message from the worker
worker.addEventListener('message', function (e) {
$('#output').html(e.data);
}, false);
// Start the worker
worker.postMessage('');
});
<script type="text/js-worker">
var result;
self.addEventListener('message', function (e) {
for (var i = 0; i < 1e9; i++) {
result = i;
}
// Send message back to the main script
self.postMessage('Done! Worker counted to ' + result);
}, false);
</script>
<button type="button" id="button1">Run without Workers</button>
<button type="button" id="button2">Run with Workers</button>
<button type="button" id="reset">Reset</button>
<div>Timer: <span id="timer">0</span></div>
<div>Output: <span id="output"></span></div>
Optimized by setTimeout:
var time = 0;
window.setInterval(function () {
time++;
$('#timer').html(time);
}, 100);
$('#reset').on('click', function () {
$('#output').empty();
time = 0;
});
$('#button1').on('click', function () {
var result;
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 1000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 2000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 3000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 4000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 5000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 6000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 7000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 8000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
}, 9000);
setTimeout(()=>{
for (var i = 0; i < 1e8; i++) {
result = i;
}
$('#output').html('Done! Counted to ' + result);
}, 10000);
});
$('#button2').on('click', function () {
var blob = new Blob(
Array.prototype.map.call(
document.querySelectorAll('script[type="text/js-worker"]'),
function (oScript) { return oScript.textContent; }
),
{ type: 'text/javascript' }
);
// Create a new worker containing all "text/js-worker" scripts.
var worker = new Worker(window.URL.createObjectURL(blob));
// Listen for a message from the worker
worker.addEventListener('message', function (e) {
$('#output').html(e.data);
}, false);
// Start the worker
worker.postMessage('');
});
<script type="text/js-worker">
var result;
self.addEventListener('message', function (e) {
for (var i = 0; i < 1e9; i++) {
result = i;
}
// Send message back to the main script
self.postMessage('Done! Worker counted to ' + result);
}, false);
</script>
<button type="button" id="button1">Run without Workers</button>
<button type="button" id="button2">Run with Workers</button>
<button type="button" id="reset">Reset</button>
<div>Timer: <span id="timer">0</span></div>
<div>Output: <span id="output"></span></div>