[Seaside] Asynchronous message sending and Comet

Rob Withers reefedjib at gmail.com
Wed Sep 29 09:48:23 UTC 2010


bump.  Can someone help me with this question, please?

--------------------------------------------------
From: "Rob Withers" <reefedjib at gmail.com>
Sent: Saturday, September 25, 2010 3:31 PM
To: "Seaside - general discussion" <seaside at lists.squeakfoundation.org>
Subject: Re: [Seaside] Asynchronous message sending and Comet

> I am working my way to building the Login/Register/ChangePassword/Home 
> components of my app and navigating between them.   There are asynchronous 
> messages being used.  I have an AccountManager instance, held by my 
> session, which asynchronously talks to a SecureAccountManager in another 
> image.  This results in the following seaside callbacks not having an 
> immediate answer from async api invocation.
>
> LoginComponent>>login calls #login: on the acctMgr.  On success it expects 
> to go to the HomeComponent.  On failure it shows its page with an error 
> message.
>
> RegisterComponent>>registerUser calls registerAccount: on the acctMgr.  On 
> success it expects to go to the HomeComponent.  On failure it shows its 
> page with an error message.
>
> ChangePasswordComponent>>changePassword calls changePassword: on the 
> acctMgr.  On success it expects to go to the HomeComponent.  On failure it 
> shows its page with an error message.
>
> My code looks like the following such that the callbacks I am registering 
> for dealing with the asynchronous messaging get called after control 
> leaves the Seaside callback.
>
> (self session login: self credentials)
> whenResolved: [:acct | self answer: acct];
> whenBroken: [:msg | self loginFailed].
>
>
> When I run the Register and then Login callbacks, I get the following 
> error:
>
>    "GRError: You can only #call: and #answer: from within a callback or a 
> Task"
>
> Sorry for the long lead up...I am definitely outside of a callback flow of 
> control, or a Task flow of control.  In otherwords I am outside of the 
> HTTP request/response cycle.
>
> So I need to use Comet.  It seems easy enough, but I am confused.
>
> Let's continue with my LoginComponent (presumably the same would be done 
> to other Components).
>
> In its renderContentOn: html, I need to add the following:
>
> LoginComponent>>renderContentOn: html
>
>    html div
>        id: 'login';
>        class: 'generic';
>        with: [...];
>    html script: (html comet
>        pusher: self class pusher;
>        connect)
>
> I gave the div an id and I installed and connected a comet script.
>
> Later, when my async reply comes in, I call a method update
>
> LoginComponent>>update
>
>    self class pusher javascript: [:script |
>        script element
>            id: 'login';
>            update: ????].
>
> My question concerns what I should update with (where the ???? is).  To 
> complicate matters, I want to do two different things depending on success 
> or failure of my code.  On success, I want to switch to a different 
> component.  Without asynchrony I would send "answer: acct".   Is this 
> possible in a comet script?  I want the other component to have control/be 
> the active component (I am not sure how to describe this.  When a 
> component sends #call: with another component, he is switching control to 
> that component, right?).  On failure, I want to refresh the error message 
> (it may not be displayed...) showing login failed, but leaving the 
> LoginComponent as the active component.
>
> How can I go about doing these things?
>
> Many thanks!
> Rob
>
> --------------------------------------------------
> From: "Rob Withers" <reefedjib at gmail.com>
> Sent: Monday, September 20, 2010 7:21 PM
> To: "Seaside - general discussion" <seaside at lists.squeakfoundation.org>
> Subject: Re: [Seaside] Asynchronous message sending 
> andSeaside/Script.aculo.us/JavaScript/AJAX
>
>> Thanks for pointing this out, Lukas.  I have a lot to learn with Seaside, 
>> and am now just reading the book.  I noticed there is a section on Comet, 
>> which I read.  It is good to know that async events can update the page.
>>
>> Cheers,
>> Rob
>>
>> --------------------------------------------------
>> From: "Lukas Renggli" <renggli at gmail.com>
>> Sent: Monday, September 20, 2010 11:47 AM
>> To: "Seaside - general discussion" <seaside at lists.squeakfoundation.org>
>> Subject: Re: [Seaside] Asynchronous message sending 
>> andSeaside/Script.aculo.us/JavaScript/AJAX
>>
>>>> I am trying to figure out how I can integrate my asynchronous message
>>>> sending framework with Seaside.  From my reading, it seems that Seaside
>>>> works on a request/response model.  Furthermore, with
>>>> JavaScript/AJAX/Script.aculo.us it still works on a request/response 
>>>> model.
>>>
>>> Yes, this is how HTTP is designed.
>>>
>>>> There seems there is no way to "push" events/content.   Is this 
>>>> accurate?
>>>
>>> No.
>>>
>>> For a long time there is the Comet package that provides a "hack" for
>>> pushing events from the server to the client. See the Comet examples
>>> that come with every Seaside distribution.
>>>
>>> Also Philippe recently published a WebSocket implementation for
>>> Seaside, but that doesn't work with all web browsers yet.
>>>
>>> Lukas
>>>
>>> -- 
>>> Lukas Renggli
>>> www.lukas-renggli.ch
>>> _______________________________________________
>>> seaside mailing list
>>> seaside at lists.squeakfoundation.org
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>
>>
> 


More information about the seaside mailing list