'da arama yapar (Bu başlık, yalnızca insanların ahşaplarla çıkıp kulüplere bürünmesini, ancak beni duymasını sağlamalıdır).Senkronize RPC, GWT
Eşzamansız bir çağrıdan bir değer döndürmem gereken bir kullanım durumum var. (GWT-Platform kullanıyorum, ancak kavramlar aynı.) Son JavaScriptObject dizisini ilan ettim, sonra AsyncCallback içindeki değeri atadım. Ancak, değeri döndürmeliyim ve yöntem AsyncCallback tamamlanmadan önce döner. Bu nedenle, AsyncCallback tamamlanana kadar bir şekilde engellemeliyim. Başka bir yöntemde iade edilen değere ihtiyacım var, ya da sadece onSuccess() 'da ihtiyacım olan şeyi yapmalıyım.
Döngüler, Zamanlayıcılar ve şanssız birkaç başka yöntem denedim. Biri yardım edebilir mi?
@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];
}
GÜNCELLEME: İstendiği gibi, doGetWhereIAmMarker() işlevini çağıran kod işte burada. Bir parametre olarak Google Map nesnesiyle (JavaScriptObject olarak) ayrı bir yerel yöntem denemeyi denedim, ancak bu yöntemi yerel yöntemler arasında geçirmenin söz konusu nesneyi güncelleme yeteneğini ortadan kaldırdığı anlaşılıyor.
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) {
[email protected]::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);
});
}-*/;
Daha fazla kod gösterebilir misiniz? Bu kodu çağıran bölümler ve "doGetWhereAmIMarker (...)" dan döndürülen JavaScriptObject'i kullanan bölümlerle ilgileniyorum. –
Çağrı yerel yöntemi eklendi. GoogleMapUtil şu adrestedir: https://github.com/dartmanx/mapmaker/blob/master/src/main/java/org/jason/mapmaker/client/util/GoogleMapUtil.java, ancak createMarker() yöntemiyle işlenmemiş .Bununla birlikte, createMarkerArray() yöntemine benzer. – Jason
Neden çalışmıyor (eğer bir süre koyduysanız (asyncIsDone) {sleep}. Bu yapmak için en basit şey gibi görünüyor veya belli bir süre geçtikten sonra devam edecek() {uyku} için? – Rohan