Stop further execution till rpc completes

39 views
Skip to first unread message

Deepak Singh

unread,
Aug 1, 2011, 11:29:17 AM8/1/11
to google-we...@googlegroups.com
Hi,

I have a requirement, 

// some code here 1

RPC call

// some code here 2

I want to stop any further execution after rpc call till rpc completes. When RPC call is finished, the control should automatically start executing next line of code.

I tried Scheduler class but could get into success.


Paul Robinson

unread,
Aug 1, 2011, 11:37:38 AM8/1/11
to google-we...@googlegroups.com
There have been lots of people ask this question here. The advice you will get is:
(1) Don't try to do it like that. It's evil.
(2) Embrace asynchrony.

Here's what your code should look like:

// some code here 1

myservice.rpcCall(args, new AsyncCallback<Foo> {
public void onFailure(Throwable t) {}

public void onSuccess(Foo foo) {


// some code here 2
}

});

Paul

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

Jens

unread,
Aug 1, 2011, 11:38:57 AM8/1/11
to google-we...@googlegroups.com
Its not possible to stop execution as RPC requests are async. The only thing you can do is to put your code that has to wait into the onSuccess method of your RPC call.

-- J.

Deepak Singh

unread,
Aug 1, 2011, 12:23:15 PM8/1/11
to google-we...@googlegroups.com
I am making 2 seperate RPC calls.
 Whichever is finished first, i would add RootPanel.get("id").add(widget) into onSuccess.

I can not add same widgets two times in both onSuccess(). So i am out of mind how to resolve this.

Any logic pls.

On Mon, Aug 1, 2011 at 9:08 PM, Jens <jens.ne...@gmail.com> wrote:
Its not possible to stop execution as RPC requests are async. The only thing you can do is to put your code that has to wait into the onSuccess method of your RPC call.

-- J.

--
You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group.

Magno Machado

unread,
Aug 1, 2011, 1:13:48 PM8/1/11
to google-we...@googlegroups.com
I think you'll have to do something like this:

public class MyEntryPoin implements EntryPoint {
  private boolean alreadyAddedWidget;
  public void onModuleLoad() {
    alreadyAddedWidget = true;
    MyService service = GWT.create(MyService.class);
    service.someCall(args, new AsyncCallback<Foo>() {
      public void onFailure(Throwable caught) {}
      public void onSuccess(Foo result) {
        if (alreadyAddedWidget)
          return;
        alreadyAddedWidget = true;
        RootPanel.get().add(...);
      }
    }

    service.anotherCall(args, new AsyncCallback<Bar>() {
      public void onFailure(Throwable caught) {}
      public void onSuccess(Bar result) {
        if (alreadyAddedWidget)
          return;
        alreadyAddedWidget = true;
        RootPanel.get().add(...);
      }
    }
  }
}

Magno Machado

unread,
Aug 1, 2011, 1:14:23 PM8/1/11
to google-we...@googlegroups.com
>  public void onModuleLoad() {
>    alreadyAddedWidget = true;
Sorry, it should be set to false here

Alan Chaney

unread,
Aug 1, 2011, 1:18:00 PM8/1/11
to google-we...@googlegroups.com
How about:
    if (!RootPanel.get("id).contains(widget)) {
        RootPanel.get("id").add(widget);

Because of the nature of javascript and web browsers the above call is inherently "thread safe".

HTH

Alan

Deepak Singh

unread,
Aug 1, 2011, 2:51:27 PM8/1/11
to google-we...@googlegroups.com
There is no contains(widget) available like RootPanel.get("id).contains(widget).

Alan Chaney

unread,
Aug 1, 2011, 3:25:33 PM8/1/11
to google-we...@googlegroups.com
True its WidgetCollection that has a 'contains' method but a RootPanel.get returns a RootPanel object which is a sub-class of ComplexPanel.

ComplexPanel has a getWidgetIndex methods which return -1 for getWidgetIndex(Widget) and null for getWidgetIndex(HasWidget) when the requested object isn't in the widget list. You can derive your own 'contains' logic from the above.


Its purely a matter of style, but I'd personally prefer to avoid having extra state flags to manipulate and would rather use state that's already in the data of the object in question.


Alan

Mark

unread,
Aug 1, 2011, 12:42:40 PM8/1/11
to Google Web Toolkit
You could always do the following

boolean alreadyAdded = false;

void addWidget(Widget widget) {
if (!alreadyAdded) {
alreadyAdded = true;
RootPanel.get().add(widget);
}
}

and then call addWidget() in each onSuccess(); first caller wins.
Reply all
Reply to author
Forward
0 new messages