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