[Seaside] Asynchronous message sending and Comet
Rob Withers
reefedjib at gmail.com
Sat Sep 25 19:31:48 UTC 2010
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