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