Note this last revision brings back a bit more of Robert's version, it's
more 50/50 now.


Rick



On Thu, Jun 25, 2009 at 12:53 PM, Rick Waldron <waldron.r...@gmail.com>wrote:

> You're right... It appears i copied the source in a bit hastily. After
> re-examining, I've revised again...
>
> http://jsbin.com/ajoqu
>
> Rick
>
>
>
>
> On Thu, Jun 25, 2009 at 9:37 AM, joe t. <thooke...@gmail.com> wrote:
>
>>
>> Rick,
>> Maybe i'm missing how that revision works, but it appears to me that
>> your stop property doesn't actually stop the repeater. Your stop
>> returns before further execution happens, but the timeout ID for the
>> window still exists.
>>
>> What am i missing?
>> -joe t.
>>
>>
>> On Jun 24, 12:20 pm, Rick Waldron <waldron.r...@gmail.com> wrote:
>> > I made a few modifications to your version, allowing repeat() to behave
>> like
>> > delay() with regard to arguments
>> >
>> > I've posted a demo here:
>> >
>> > http://jsbin.com/ekone
>> >
>> > All the output is to the firebug console... i've included fbug lite just
>> in
>> > case
>> >
>> > Rick
>> >
>> > On Wed, Jun 24, 2009 at 10:50 AM, Rick Waldron <waldron.r...@gmail.com
>> >wrote:
>> >
>> > > I've subbed my implementation with your to do some use-case testing.
>> I'll
>> > > report back anything of interest as I go along.
>> >
>> > > Rick
>> >
>> > > On Wed, Jun 24, 2009 at 10:49 AM, Rick Waldron <
>> waldron.r...@gmail.com>wrote:
>> >
>> > >> 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