angular-docs-cn/packages/zone.js/example/throttle.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>