Hi,

The only remaining problems I'm seeing are that you're using alert
(don't do that, append to the body or something, alert does awkward
things) and you're using onSuccess now instead of onComplete as you
were originally. onComplete is what you want to trigger the next
message (Ajax calls *do* fail).

The queuing seems to work when you use setTimeout to simulate async
ajax:
http://jsbin.com/egudo3
...but what the actual problem is when you're doing what you're
describing, I couldn't say without extensive debugging I'm afraid I
don't have time to go into.

Off-topic: Strongly recommend *not* leaving off semicolons and braces
(your add function). You may want to minify later (semicolons) and
leaving off braces in my experience (20+ years in C-like syntax) is
always more trouble than it's worth. YMMV

Good luck,

-- T.J.

On Aug 13, 10:46 am, Moo <stuhlm...@fifty-nine.de> wrote:
> Here is a working example:http://jsfiddle.net/zkuMv/
>
> On 13 Aug., 11:43, Moo <stuhlm...@fifty-nine.de> wrote:
>
>
>
> > Hi T.J.,
>
> > thank you for your reply. You are right about the idle-flag, I already
> > renamed it :)
> > I followed your advice and moved up the "idle = false" thing, but it
> > does not work so well.
> > With a slow connection the code below works fine:
>
> > var MessageQueue = Class.create({
> >     initialize: function(url) {
> >         this.url = url;
> >         this.queue = [];
> >         this.busy = false;
> >     },
> >     add: function(message) {
> >         if (this.busy) this.queue.push(message)
> >         else this.push(message);
> >     },
> >     push: function(message) {
> >         this.busy = true;
> >         new Ajax.Request(this.url, {
> >             onSuccess: function() {
> >                 alert(message);
> >                 this.busy = false;
> >                 if (this.queue.size() > 0) {
> >                     this.push("queued: " + this.queue.shift());
> >                 }
> >             }.bind(this)
> >         });
> >     }
>
> > });
>
> > var mq = new MessageQueue("/ajax_html_echo/");
> > mq.add("First");
> > mq.add("Second");
> > mq.add("Third");
>
> > But when the backend is fast and you type the hell out of your
> > keyboard, it seems, that the part
> > this.push("queued: " + this.queue.shift());
> > is never reached. There is no output with "queued:"
>
> > My thought was, that when new messages arrive, while a request is in
> > progess, to store them until the request is finished. Then all
> > messages in the stack should be sent until the busy-flag is set to
> > false. Therefore I had it below the if-condition.
>
> > I saw that the guys at jQuery use a sentinel "inprogress" which they
> > unshift/shift to/from the array. But I don't know if that would be
> > helpful here.
>
> > It would be super great if you have the time, to have a second look at
> > it!
>
> > Thank you so much
>
> > On 13 Aug., 10:18, "T.J. Crowder" <t...@crowdersoftware.com> wrote:
>
> > > Hi,
>
> > > Your "idle" flag -- which you seem to use to mean "busy processing a
> > > request", which I found *really* confusing at first :-) -- is getting
> > > cleared inappropriately whenever you pull something from your queue. I
> > > don't know that that's the problem, but it's probably wrong. The error
> > > is in your onComplete function:
>
> > > if (this.queue.size() > 0) {
> > >     console.log("queue-size > 0, so enqueue next item");
> > >     this.push("queued: " + this.queue.shift());}
>
> > > this.idle = false; // <=== Error if `if` above was true
>
> > > If there's something in the queue, you call `push`, which sets the
> > > flag, starts a new async request, and returns. But then you clear the
> > > flag, so the next time `add` gets called, it'll think it should call
> > > `push` rather than `queue.push` even though there's an outstanding
> > > request.
>
> > > If you just move the `this.idle = false;` line above the `if`
> > > statement, it should sort out this issue. Whether it solves the
> > > problems you described I can't say, but I suspect it'll solve at least
> > > some of them.
>
> > > HTH,
> > > --
> > > T.J. Crowder
> > > Independent Software Consultant
> > > tj / crowder software / comwww.crowdersoftware.com
>
> > > On Aug 12, 7:55 pm, Moo <stuhlm...@fifty-nine.de> wrote:
>
> > > > Hi there,
>
> > > > I want to ensure, that messages are posted in the order, they come in
> > > > the stack. My tests at jsFiddle were okay, but with a quick backend
> > > > (where the requests are processed very fast) the order is crap.
> > > > Sometimes items are posted twice. Is there anybody who can help me
> > > > out? Thank you all!
>
> > > > var MessageQueue = Class.create({
> > > >         initialize: function(url) {
> > > >         this.url = url;
> > > >         this.queue = [];
> > > >         this.idle = false;
> > > >         },
> > > >         add: function(message) {
> > > >         if (this.idle) {
> > > >                 console.log("idle, so saved to queue: " + message);
> > > >                 this.queue.push(message);
> > > >         } else {
> > > >                 console.log("not idle, so pushed directly: " + message);
> > > >                 this.push(message);
> > > >         }
> > > >         },
> > > >         push: function(message) {
> > > >         this.idle = true;
> > > >         console.log("Ajax.Request will be called now!");
> > > >         new Ajax.Request(this.url + "&message=" +
> > > > encodeURIComponent(message), {
> > > >                 onComplete: function() {
> > > >                         console.log("successfully sent: " + message);
> > > >                 if (this.queue.size() > 0) {
> > > >                         console.log("queue-size > 0, so enqueue next 
> > > > item");
> > > >                         this.push("queued: " + this.queue.shift());
> > > >                 }
> > > >                 this.idle = false;
> > > >                 }.bind(this)
> > > >         });
> > > >         }
>
> > > > });- Zitierten Text ausblenden -
>
> > > - Zitierten Text anzeigen -- Zitierten Text ausblenden -
>
> > - Zitierten Text anzeigen -

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

Reply via email to