Thanks for your reply. But I'm having trouble understanding your code. The "publishGetStuff" method refers to $entry. What is that?
The "staticGetStuff" method refers to a variable "service". Where is that variable stored? It looks like when users call $wnd.getStuff then they have to pass in a function, when I want them to pass in an object with a function defined that matches the name of MyCallback.onSuccess method. Thanks- -Ryan On Feb 4, 10:52 am, Thomas Broyer <[email protected]> wrote: > On Feb 4, 5:54 pm, Ryan Heaton <[email protected]> wrote: > > > > > Hi. > > > Here's my problem. I've got a GWT client-side service method that > > makes a remote call to a server. Since the result of the remote call > > is returned asynchronously, the service method takes a "callback" as a > > parameter. It's basically just an interface with two methods > > "onSuccess" and "onFailure". > > > So everything works great when invoking the service from GWT code, but > > the problem is exposing this service method to be invokable by a > > separate javascript library. Exposing the service method is possible > > with tools akin to GWT exporter, but the problem is with the callback. > > The "onSuccess" and "onFailure" methods are obfuscated by the compiler > > so I have no reliable way to create a callback object from handwritten > > javascript that will work when that method is invoked. > > > Here's an example for the sake of clarity. Let's say I've got a > > service interface defined like this: > > > public interface MyService { > > void getStuff(new MyCallback()); > > > } > > > And the "MyCallback" interface is defined like this: > > > public interface MyCallback { > > void onSuccess(Stuff stuff); > > > } > > > Let's say I bind the "getStuff" method to a javascript method of the > > same name. I can then invoke the method from javascript, but I have no > > way of reliably constructing an instance of "MyCallback" from > > javascript because I don't know what the "onSuccess" method will be > > named in javascript after is passes through the GWT compiler. > > > What I'd really like is to be able to define my callback like this: > > > public interface MyCallback { > > @PreserveMethodName //or some annotation like that. > > void onSuccess(Stuff stuff); > > > } > > > And then my javascript would look something like: > > > var callback = {}; > > callback.onSuccess = function(stuff) {...} > > getStuff(callback); > > > Thoughts? Any suggestions for me? > > Something like this maybe (not tested, just an idea): > > private static void publishGetStuff(MyService service) /*-{ > $wnd.getStuff = $entry(@my.package.Foo::staticGetStuff(Lcom/google/ > gwt/core/client/JavaScriptObject;)); > > }-*/; > > private static void staticGetStuff(final JavaScriptObject onSuccessFn) > { > service.getStuff(new MyCallBack() { > public void onSuccess(Stuff stuff) { > nativeOnSuccess(onSuccessFn, stuff); > } > private void native nativeOnSuccess(JavaScriptObject onSuccessFn, > Stuff stuff) /*-{ > onSuccessFn(stuff); > }-*/; > } > > } > > -- 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.
