(Tiêu đề đó một mình sẽ khiến mọi người thoát ra khỏi đồ gỗ để bash tôi với câu lạc bộ, nhưng nghe tôi nói).Cuộc gọi RPC Đồng bộ trong GWT
Tôi có trường hợp sử dụng mà tôi cần trả lại giá trị từ cuộc gọi không đồng bộ. (Tôi đang sử dụng GWT-Platform, nhưng các khái niệm đều giống nhau.) Tôi đã khai báo một mảng JavaScriptObject cuối cùng, sau đó gán giá trị trong AsyncCallback. Tuy nhiên, tôi cần trả về giá trị và phương thức trả về trước khi AsyncCallback hoàn tất. Vì vậy, tôi cần phải chặn bằng cách nào đó cho đến khi AsyncCallback hoàn thành. Tôi cần giá trị trả về trong một phương thức khác, hoặc tôi chỉ cần làm những gì tôi cần trong onSuccess().
Tôi đã thử vòng lặp, Bộ hẹn giờ và một vài phương pháp khác không có may mắn. Có ai giúp được không?
@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];
}
Cập nhật: Theo yêu cầu, đây là mã gọi doGetWhereIAmMarker(). Tôi đã cố gắng có một phương pháp riêng biệt riêng với đối tượng Google Map (dưới dạng JavaScriptObject) làm tham số, nhưng dường như việc truyền đối tượng đó giữa các phương thức gốc sẽ làm mất khả năng cập nhật đối tượng đã nói.
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);
});
}-*/;
Bạn có thể hiển thị thêm một số mã không? Tôi quan tâm đến các phần gọi mã này, và cũng là các phần tiêu thụ JavaScriptObject được trả về từ 'doGetWhereAmIMarker (...)'. –
Đã thêm phương thức gốc gọi. GoogleMapUtil có tại https://github.com/dartmanx/mapmaker/blob/master/src/main/java/org/jason/mapmaker/client/util/GoogleMapUtil.java, nhưng không được cam kết với phương thức createMarker() .Nó tương tự như phương thức createMarkerArray(). – Jason
Tại sao nó không hoạt động sau đó nếu bạn chỉ cần đặt một thời gian (asyncIsDone) {sleep}. có vẻ như điều đơn giản nhất để làm ... hoặc biến nó thành() {sleep} sẽ tiếp tục sau một thời gian nhất định? – Rohan