92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!doctype html>
 | |
| <html>
 | |
| <head>
 | |
|   <meta charset="utf-8">
 | |
|   <title>Zones throttle</title>
 | |
|   <link rel="stylesheet" href="css/style.css">
 | |
|   <script src="../dist/zone.js"></script>
 | |
|   <script src="../dist/long-stack-trace-zone.js"></script>
 | |
| </head>
 | |
| <body>
 | |
|   <h1>Throttle Example</h1>
 | |
| 
 | |
|   <button id="b2">Error</button>
 | |
| 
 | |
|   <script>
 | |
|   /*
 | |
|    * In this example, we have a button that makes some request
 | |
|    * to our server. We want to only make the request once per
 | |
|    * 1s, so we use a `throttle` helper. If the request fails,
 | |
|    * it's difficult to see where the failure originated from.
 | |
|    *
 | |
|    * Thankfully, we can use zones to preserve the stack even
 | |
|    * across async tasks to get a better picture of the control
 | |
|    * flow of the app.
 | |
|    */
 | |
| 
 | |
|   var throttleMakeRequest;
 | |
| 
 | |
|   /*
 | |
|    * Start the app
 | |
|    * Bind listeners
 | |
|    */
 | |
|   function bootstrap () {
 | |
|     b2.addEventListener('click', throttleMakeRequest);
 | |
|   }
 | |
| 
 | |
|   /*
 | |
|    * Makes a request to the server
 | |
|    * Will only make the request once every 1000ms
 | |
|    */
 | |
|   throttleMakeRequest = throttle(function () {
 | |
|     makeRequestToServer(handleServerResponse);
 | |
|   }, 1000);
 | |
| 
 | |
| 
 | |
|   /*
 | |
|    * Pretend this makes a request to a server
 | |
|    */
 | |
|   function makeRequestToServer (cb) {
 | |
|     setTimeout(cb, 100);
 | |
|   }
 | |
| 
 | |
| 
 | |
|   function handleServerResponse (err, data) {
 | |
|     throw new Error('Oops');
 | |
|   }
 | |
| 
 | |
| 
 | |
|   /*
 | |
|    * Returns a fn that can only be called once
 | |
|    * per `time` milliseconds
 | |
|    */
 | |
|   function throttle (fn, time) {
 | |
|     var id = null;
 | |
|     if (typeof time !== 'number') {
 | |
|       time = 0;
 | |
|     }
 | |
|     return function () {
 | |
|       if (!id) {
 | |
|         id = setTimeout(function () {
 | |
|           id = null;
 | |
|           fn();
 | |
|         }, time);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /*
 | |
|    * Start the application
 | |
|    *
 | |
|    * If we start the application with `zone.run`, we
 | |
|    * get long stack traces in the console!
 | |
|    */
 | |
| 
 | |
|   //bootstrap();
 | |
|   Zone.current.fork(Zone.longStackTraceZoneSpec).run(bootstrap);
 | |
| 
 | |
|   </script>
 | |
| 
 | |
| </body>
 | |
| </html>
 |