में सिंक्रोनस आरपीसी कॉल (अकेले उस शीर्षक से लोगों को मुझे लकड़ी के काम से बाहर आने के लिए क्लबों से बाहर निकलना चाहिए, लेकिन मुझे सुनना चाहिए)।जीडब्ल्यूटी
मेरे पास एक उपयोग केस है जहां मुझे एक एसिंक्रोनस कॉल से मूल्य वापस करने की आवश्यकता है। (मैं जीडब्ल्यूटी-प्लेटफ़ॉर्म का उपयोग कर रहा हूं, लेकिन अवधारणाएं समान हैं।) मैंने अंतिम जावास्क्रिप्ट ऑब्जेक्ट सरणी घोषित की, फिर AsyncCallback के भीतर मान असाइन किया। हालांकि, मुझे मान वापस करने की आवश्यकता है, और AsyncCallback पूर्ण होने से पहले विधि वापस आती है। इसलिए, मुझे AsyncCallback पूरा होने तक किसी भी तरह से अवरुद्ध करने की आवश्यकता है। मुझे किसी अन्य विधि में लौटाए गए मूल्य की आवश्यकता है, या मैं केवल वही करूँगा जो मुझे आवश्यकता है()।
मैंने लूप, टाइमर और कुछ अन्य तरीकों से भाग्य की कोशिश की है। क्या कोई मदद कर सकता है?
@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];
}
अपडेट: जैसा कि अनुरोध किया गया है, यहां कोड है जो GGetWhereIAmMarker() को कॉल करता है। मैंने पैरामीटर के रूप में Google Map ऑब्जेक्ट (जावास्क्रिप्ट ऑब्जेक्ट के रूप में) के साथ एक अलग मूल विधि रखने का प्रयास किया है, लेकिन ऐसा प्रतीत होता है कि देशी ऑब्जेक्ट्स के बीच उस ऑब्जेक्ट को पास करने से ऑब्जेक्ट को अपडेट करने की क्षमता मिल जाती है।
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);
});
}-*/;
क्या आप कुछ और कोड दिखा सकते हैं? मुझे उन हिस्सों में दिलचस्पी है जो इस कोड को कॉल करते हैं, और वे हिस्सों जो जावास्क्रिप्ट ऑब्जेक्ट का उपभोग करते हैं जो 'doGetWhereAmIMarker (...)' से वापस आती है। –
कॉलिंग मूल विधि जोड़ा गया। GoogleMapUtil https://github.com/dartmanx/mapmaker/blob/master/src/main/java/org/jason/mapmaker/client/util/GoogleMapUtil.java पर है, लेकिन createMarker() विधि के साथ प्रतिबद्ध नहीं है ।यह createMarkerArray() विधि के समान है, हालांकि। – Jason
यदि आप थोड़ी देर (asyncIsDone) {sleep} डालते हैं तो यह क्यों काम नहीं करता है। ऐसा करने के लिए सबसे सरल बात की तरह लगता है ... या इसे() {नींद} के लिए एक निश्चित समय बीतने के बाद जारी रहेगा? – Rohan