function exec() {
        callback();
        cache.ts = Date.now();
        if(cache.onDone) {
            cache.onDone();
            cache.onDone = null;
        }
    }
Throttle a callback. `callback` executes synchronously only if
more than `minInterval` milliseconds have already elapsed since the latest
call (if any). Otherwise we wait until `minInterval` is over and execute the
last callback received while waiting.
So the first and last events in a train are always executed (eventually)
but some of the events in the middle can be dropped.

@param {string} id: an identifier to mark events to throttle together
@param {number} minInterval: minimum time, in milliseconds, between
  invocations of `callback`
@param {function} callback: the function to throttle. `callback` itself
  should be a purely synchronous function.