(Only this title should make people get out of the tree on bash me with clubs, but listen to me).
I use the case when I need to return a value from an asynchronous call. (I use the GWT platform, but the concepts are the same.) I declared the final JavaScriptObject array and then assigned a value to AsyncCallback. However, I need to return a value, and the method returns before AsyncCallback completes. So I need to somehow lock until AsyncCallback is complete. I need the returned value in another method, or I just do what I need in onSuccess ().
I tried cycles, timers, and several other methods with no luck. Can anyone help?
@Override public JavaScriptObject doGetWhereAmIMarker(final double lng, final double lat) { final JavaScriptObject[] markerArray = new JavaScriptObject[1]; // ugly hack, I know dispatch.execute(new GetLocationDescriptionsAction(lng, lat), new AsyncCallback<GetLocationDescriptionsResult>() { @Override public void onFailure(Throwable caught) { caught.printStackTrace(); } @Override public void onSuccess(GetLocationDescriptionsResult result) { Map<String, Location> resultMap = result.getResult(); StringBuffer message = new StringBuffer(); for (String key : resultMap.keySet()) { message.append(key).append(": ").append(resultMap.get(key)).append("\n"); } Map tempMap = new HashMap(); tempMap.put("TITLE","Location Information"); tempMap.put("LAT", lat); tempMap.put("LNG", lng); tempMap.put("CONTENTS", message.toString()); JavaScriptObject marker = GoogleMapUtil.createMarker(tempMap); markerArray[0] = marker; if (markerArray[0] != null) { GWT.log("Marker Array Updated"); } } }); return markerArray[0]; }
UPDATE: as requested, here is the code that calls doGetWhereIAmMarker (). I tried to have a separate native method with a Google Map object (like JavaScriptObject) as a parameter, but it seems that passing this object between native methods kills the ability to update the specified object.
public native void initMap(JavaScriptObject mapOptions, JavaScriptObject bounds, JavaScriptObject border, JsArray markerArray, Element e) /*-{ // create the map and fit it within the given bounds map = new $wnd.google.maps.Map(e, mapOptions); if (bounds != null) { map.fitBounds(bounds); } // set the polygon for the borders if (border != null) { border.setMap(map); } // set up the info windows if (markerArray != null && markerArray.length > 0) { var infoWindow = new $wnd.google.maps.InfoWindow({ content:"InfoWindow Content Goes Here" }); for (var i = 0; i < markerArray.length; i++) { var marker = markerArray[i]; marker.setMap(map); $wnd.google.maps.event.addListener(marker, 'click', function() { infoWindow.setContent(marker.content); infoWindow.open(map, this); }); } } // need to reference the calling class inside the function(), so set a reference to "this" var that = this; $wnd.whereAmI=function(lng, lat) { that.@org.jason.mapmaker.client.view.MapmakerMapViewImpl::whereAmI(DD)(lng,lat); } $wnd.google.maps.event.addListener(map, 'click', function(event) { var lat = event.latLng.lat(); var lng = event.latLng.lng(); $wnd.whereAmI(lng, lat); }); }-*/;