96 lines
2.6 KiB
HTML
96 lines
2.6 KiB
HTML
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Counting Pending Tasks</title>
|
|
<link rel="stylesheet" href="css/style.css">
|
|
<script src="../dist/zone.js"></script>
|
|
<script src="js/counting-zone.js"></script>
|
|
</head>
|
|
<body>
|
|
|
|
<h1>Counting Pending Tasks</h1>
|
|
|
|
<p>We want to know about just the events from a single mouse click
|
|
while a bunch of other stuff is happening on the page</p>
|
|
|
|
<p>This is useful in E2E testing. Because you know when there are
|
|
no async tasks, you avoid adding timeouts that wait for tasks that
|
|
run for an indeterminable amount of time.</p>
|
|
|
|
<button id="b1">Start</button>
|
|
|
|
<p id="output"></p>
|
|
|
|
<script>
|
|
/*
|
|
* Zone that counts pending async tasks
|
|
*/
|
|
const outputElem = document.getElementById('output');
|
|
const countingZoneSpec = Zone['countingZoneSpec'];
|
|
const myCountingZone = Zone.current.fork(countingZoneSpec).fork({
|
|
onScheduleTask(parent, current, target, task) {
|
|
parent.scheduleTask(target, task);
|
|
console.log('Scheduled ' + task.source + ' => ' + task.data.handleId);
|
|
outputElem.innerText = countingZoneSpec.counter();
|
|
},
|
|
onInvokeTask(parent, current, target, task) {
|
|
console.log('Invoking ' + task.source + ' => ' + task.data.handleId);
|
|
parent.invokeTask(target, task);
|
|
outputElem.innerText = countingZoneSpec.counter();
|
|
},
|
|
onHasTask(parent, current, target, hasTask) {
|
|
if (hasTask.macroTask) {
|
|
console.log("There are outstanding MacroTasks.");
|
|
} else {
|
|
console.log("All MacroTasks have been completed.");
|
|
}
|
|
}
|
|
});
|
|
|
|
/*
|
|
* We want to profile just the actions that are a result of this button, so with
|
|
* a single line of code, we can run `main` in the countingZone
|
|
*/
|
|
|
|
b1.addEventListener('click', function () {
|
|
myCountingZone.run(main);
|
|
});
|
|
|
|
|
|
/*
|
|
* Spawns a bunch of setTimeouts which in turn spawn more setTimeouts!
|
|
* This is a boring way to simulate HTTP requests and other async actions.
|
|
*/
|
|
|
|
function main () {
|
|
for (var i = 0; i < 10; i++) {
|
|
recur(i, 800);
|
|
}
|
|
}
|
|
|
|
function recur (x, t) {
|
|
if (x > 0) {
|
|
setTimeout(function () {
|
|
for (var i = x; i < 8; i++) {
|
|
recur(x - 1, Math.random()*t);
|
|
}
|
|
}, t);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* There may be other async actions going on in the background.
|
|
* Because this is not in the zone, our profiling ignores it.
|
|
* Nice.
|
|
*/
|
|
function noop () {
|
|
setTimeout(noop, 10*Math.random());
|
|
}
|
|
noop();
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|