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