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