This is fantastic feedback - thanks!




On Wed, Jun 24, 2009 at 9:55 AM, Robert Kieffer <bro...@gmail.com> wrote:

>
> I can't say I'm a big fan of this.  For several reasons.
>
> First, it's just a cosmetic replacement for setInterval(myfunction
> (...).bind(), ...) which simply isn't all that bad.
>
> Second, I'm not a fan of setInterval in general.  I've seen some
> rather nasty behavior with calls queuing up if the invoked function
> takes longer than the delay to execute.  In particular, this seems to
> be an issue if you do something like put a laptop to sleep.  (But
> maybe others haven't seen this problem???)  Thus, I prefer to use a
> self-invoking timeout like so:
>
> function myFunction() {
>    // do stuff ...
>    // call ourselves again
>    if (/*we want to continue?*/) setTimeout(myFunction, 1000)
> }
>
> This doesn't call the function at exactly one second intervals, but
> that type of accuracy is rarely important.  Instead, it guarantees you
> have at least one second of delay between invocations, which for
> distributing cpu load or polling (the more common cases where
> setInterval might be used), is more desireable.
>
> Finally, as Joe T. points out, there should be a way of cancelling the
> interval that doesn't require the user to store the returned value
> (*that* is what I find most annoying, not the syntax of
> "setInterval").
>
> Thus, I'd suggest this instead:
>
>  Object.extend(Function.prototype, {
>    repeat: function(delay) {
>      // Reset state
>      if (this._repeater) delete this._repeater;
>      this._repeatTimeout = clearTimeout(this._repeatTimeout);
>
>      if (!delay) return; // (stop repeating if no args or delay==0)
>
>      // Create setTimeout-based invoker
>      var _method = this;
>      if (!this._repeater) this._repeater = function() {
>        // Let _method cancel repeat by doing "return false;"
>        if (_method() !== false) setTimeout(_method._repeater, delay);
>      }
>
>      // Start repeating
>      this._repeatTimeout = setTimeout(this._repeater, delay);
>    },
>
>    stopRepeating: function() {
>      this.repeat();
>    }
>  });
>
> For example:
>
>  var count = 0;
>  function foo() {
>    console.log(count++);
>    return count < 10;  // Return "false" when count >= 10 to cancel
> the repeat
>  }
>
>  // Start repeating 1/sec
>  foo.repeat(1000);
>  //... some time later change interval to 2/sec
>  foo.repeat(500);
>  // ... later still stop repeating.
>  foo.stopRepeating();
>
>
> As you can see, this implementation of repeat() does a lot more for
> you than simply alias'ing "setInterval":
>  - It guarantees your function is only invoked by one interval
>  - It makes changing the interval or cancelling it altogether
> trivial.
>  - It allows you to conditionally cancel the repeat from w/in the
> function itself.
>
> The only thing missing is the bind() behavior but, well, that's what
> bind is for.   If you need to bind arguments, just bind() your
> arguments first.
>
> On Jun 23, 8:25 am, Rick Waldron <waldron.r...@gmail.com> wrote:
> > I detest the way setInterval() looks, so I came up with this... have been
> > using it my personal JS for some time.
> >
> > Object.extend(Function.prototype, {
> >   repeat: function() {
> >     var __method = this, args = $A(arguments), interval = args.shift() *
> > 1000;
> >     return window.setInterval(function() {
> >       return __method.apply(__method, args);
> >     }, interval );
> >   }
> >
> > });
> >
> > // usage:
> > var _pollInt = 0;
> > function repetiousPollFn() {
> >  console.log(_pollInt++);
> >
> > }
> >
> > repetiousPollFn.repeat(.5);
> >
> > Will, of course, repeat repetiousPollFn() every half second.
> >
> > Almost identical to .delay(), except that it returns setInterval instead
> of
> > setTimeout. One thing I intend to add is support for clearInterval,
> however
> > I figured I'd at least bring it up here first. I've never
> > proposed/contributed here before (i'm a lurker of the list :D ) - any
> > guidance is appreciated.
> >
> > Rick
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype: Core" group.
To post to this group, send email to prototype-core@googlegroups.com
To unsubscribe from this group, send email to 
prototype-core-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-core?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to