All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.asayama.gwt.angular.site.examples.client.PromiseExampleDocumentation.html Maven / Gradle / Ivy

GWT Angular supports promise pattern via Java wrapper around AngularJS's promise framework, which is inspired by Kris Kowal's Q.

The below example demonstrates how two asynchronous calls are coordinated by a third, which depends on the outcome of the first two. Promise pattern makes it easy to establish pipelines of asynchronous calls without having to write a complex sequence of nested callbacks.

When you click the "Go" button below, first, the user is warned that he must wait for 1 second to see the outcome of his action. The user's action kicks off two asynchronous calls, one generates the salutation, "Hello", and the other generates the name, "World". These two asynchronous calls take different amount of time to complete. There is a third call, which takes the results of salutation and name, and formats a greeting. The greeting message is then displayed to the screen.

View

The view code is straight forward, and has no knowledge of controller's implementation and its asynchronous nature. It assumes that the greeting data is or will be provided, hence it calls {{ getGreeting }} method on the controller to obtain the value to print to the screen.



  

Controller

Controller takes no action onload, but when the user clicks the "Go" button, it invokes onClickGo() method. This method first updates the greeting caption on screen, letting the user know that the loading of the data is in progress. Then the method goes on to invoke the getGreeting() method of GreetingService object.

This service object is something we wrote for the purpose of demonstrating the promise pattern in GWT Angular. We will look at the implementation of this service class shortly, but for now, we'll focus on the handling of the Promise<String> object returned by this service call.

The returned object is a promise that, when the promised value is ready, it would invoke the callback object that you register with this promise object. In this case, what it promises is that the object of type String will be returned, signifying the greeting value.

We pass three different callback to this promise. First callback we pass is the Done object. This object receives the greeting value, and updates the screen caption with this value. The second callback is Notify object, which listens to the progress of asynchronous calls and updates the screen to let the user know of the progress. The third callback is the Fail, which displays an error message on the screen if and when the promise fails to deliver the value.

In short, the controller merely knows how to consume the promise value, if and when it is delivered. It does not know any details about how the values are obtained.



  

Service

GreetingService is the code that handles the complexity of asynchronously loading the necessary data from the back-end. In this example, we decided to simulate asynchronous loading of the data rather than actually setting up live web services. This is because we wanted to focus on the promise and resolution of the values in the browser, and did not want to distract you with the design and implementation of web service code.

There are three public methods in this service, getGreeting(), which you have already seen being called from the controller, and two others, getName() and getSalutation(). All three public methods return an object of type Promise.

getSalutation() method simulates an asynchronous call by using a Timer class in GWT. It schedule a job to run in 1 second, which returns a string value "Hello" by calling the resolve() method on the Deferred object obtained from Q.

getName() method also simulates an asynchronous call by using a Timer class in GWT. It schedule a job to run in 0.5 seconds, which returns a string value "World" by calling the resolve() method on the Deferred object obtained from Q.

Note that neither of the getSalutaion() or getName() methods are blocking, in a sense that the caller does not have to wait for these promised string values to become available. They simply return the Promise values, so that the caller can later retrieve these values whenever they become available.

You may recall that the controller for this demo does not call these two service methods we have so far talked about, but the controller calls the getGreeting() method. Let's take a look at it now.

getGreeting() method uses q.all() service method of type Q, which is injected by AngularJS into our custom service class. This method allows the parallel execution of promises, and returns another single promise to be resolved when all promises are ready.

The concept of parallel execution is rather important. If we had executed these three asynchronous calls in series, then the execution time of the entire pipeline would have been 1.5 seconds. But because we execute them in parallel, we can execute them in 1 second, which is the slower of the two promises that the getGreeting() depends on.

The purpose of getGreeting() method is to construct a new greeting object, given the values of salutation and name. It knows how to construct this new value, but it does not have to know anything about how these values are loaded.



  

Configuration

The following modules are required in the gwt.xml.



  

The following Maven dependencies are required in the pom.xml.

<dependency>
  <groupId>com.asayama.gwt</groupId>
  <artifactId>gwt-angular-ng</artifactId>
  <version>{{ GWT_ANGULAR_VERSION }}</version>
</dependency>

You can also browse the full source code on Github.

{{ GITHUB_GWT_ANGULAR_EXAMPLES_URL }}/blob/master/gwt-angular-examples/Promise





© 2015 - 2025 Weber Informatics LLC | Privacy Policy