On 08/12/2010 12:50 PM, Kevin Qiu wrote:
> After some thought, I don't think putting it in IncrementalCommand and
> execute with DeferredCommand help much here. Jeff, If I understand you
> correctly, my execute method will look like this:
> 
> class Executor {
>   // declaration of list of commands
>   void execute() {
>     DeferredCommand.addCommand(new IncrementalCommand() {
>       boolean executing;
>       int currentIdx;
> 
>       public boolean execute() {
>         if (executing) return true;  // executor will keep looping
>         // it's my turn now
>         executing = true;
>         AsyncCommand cmd = commands.get(currentIdx);
>         cmd.execute(new AsyncCallback() {
>           public void onFailure(Throwable e) { onSuccess(null); }
>           public void onSuccess(Object o) {
>             executing = false;
>             ++currentIdx;
>           }
>       }
>       // return point
>   }
> }
> 
> The above method is actually still non-blocking. There's no guarantee
> that my incremental command will finish executing before I reach
> //return point. Did I miss anything?


Yes. There are two functions:
o function a()  which empties your commands<> list
o function b() which is the deferred command

The technique works. Give me a few minutes and I'll post a follow-up
message w/ some code.


> 
> 
> On Thu, Aug 12, 2010 at 2:35 PM, Kevin Qiu <[email protected]
> <mailto:[email protected]>> wrote:
> 
>     Thanks. That's helpful.
> 
> 
>     On Thu, Aug 12, 2010 at 12:05 PM, Jeff Chimene <[email protected]
>     <mailto:[email protected]>> wrote:
> 
>         On 08/12/2010 08:38 AM, salk31 wrote:
>         > Don't you have to count the async returning and then do yet
>         another
>         > callback?
>         >
>         > So hook into the callback of all your commands and then when
>         the last
>         > one is done do the callback?
> 
>         Extending salk31's logic:
>         Put your execute() inside a loop, inside an IncrementalCommand. Your
>         execute() routine implements a mutex. The loop terminates per
>         salk31's
>         observation. The execute() routine sets the mutex before the
>         async call,
>         and clears it in OnResponseReceived(), OnError(). The loop
>         checks that
>         mutex and immediately returns to the IncrementalCommand if set.
>         In FF
>         3.6, I found it was too easy to overload the server (resulting in
>         response timeouts) w/o serializing the calls via a mutex. IOW,
>         simply
>         allowing the brower's RPC queue to serialize (i.e. clear the
>         execute()
>         queue as fast as possible) resulted in dropped calls.
> 
>         I believe the above will work w/ Java RPC.
> 
>         If there are many list elements, you might want a timer that
>         controls a
>         "loading..." message.
> 
>         Also, you might want to evaluate at the Dictionary class to see if
>         that's a better fit for the problem you're trying to solve.
> 
>         >
>         > On Aug 12, 3:30 pm, Kevin Qiu <[email protected]
>         <mailto:[email protected]>> wrote:
>         >> I don't know if the title makes sense but working with gwt
>         for about 2
>         >> years, I often find myself in the position to mix both
>         asynchronous and
>         >> synchronous (blocking) apis. It's easy to transform a
>         synchronous call to
>         >> asynchronous, but the other way around is not immediately
>         obvious to me,
>         >> especially in the context of the single-threaded browser
>         environment.
>         >>
>         >> Imagine I the following:
>         >>
>         >> abstract class GetList<T> {
>         >>   abstract void execute(AsyncCallback<List<T>> callback);
>         >>
>         >> }
>         >>
>         >> class GetContactList extends GetList<Contact> {
>         >>   void execute(AsyncCallback<List<Contact>> callback) { /*
>         implementation */
>         >>
>         >> }
>         >> }
>         >>
>         >> class GetAddressList extends GetList<Address> {
>         >>   void execute(AsyncCallback<List<Address>> callback) { /*
>         implementation */
>         >>
>         >> }
>         >> }
>         >>
>         >> class GetPhoneList extends GetList<Phone> {
>         >>   void execute(AsyncCallback<List<Phone>> callback) { /*
>         implementation */ }
>         >>
>         >> }
>         >>
>         >> now imagine I keep a list of GetList objects:
>         >> List<GetList> commands = Arrays.asList(new GetContactList(), new
>         >> GetAddressList(), new GetPhoneList());
>         >>
>         >> and I have an executor that executes these commands:
>         >>
>         >> class Executor {
>         >>   List<? extends GetList<?>> commands;
>         >>   Executor(List<? extends GetList<?>> commands) {
>         >>     this.commands = commands;
>         >>   }
>         >>   void execute() {
>         >>   // XXX:
>         >>   }
>         >>
>         >> }
>         >>
>         >> Now, for whatever reason, I need my execute() method to be a
>         blocking call
>         >> (synchronous). It should terminate after all GetList calls
>         are returned. How
>         >> can I achieve this?
>         >
> 
>         --
>         You received this message because you are subscribed to the
>         Google Groups "Google Web Toolkit" group.
>         To post to this group, send email to
>         [email protected]
>         <mailto:[email protected]>.
>         To unsubscribe from this group, send email to
>         [email protected]
>         <mailto:google-web-toolkit%[email protected]>.
>         For more options, visit this group at
>         http://groups.google.com/group/google-web-toolkit?hl=en.
> 
> 
> 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Google Web Toolkit" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to