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>
							 |