2011-09-08 10 views
8

में सिंक्रोनस आरपीसी कॉल (अकेले उस शीर्षक से लोगों को मुझे लकड़ी के काम से बाहर आने के लिए क्लबों से बाहर निकलना चाहिए, लेकिन मुझे सुनना चाहिए)।जीडब्ल्यूटी

मेरे पास एक उपयोग केस है जहां मुझे एक एसिंक्रोनस कॉल से मूल्य वापस करने की आवश्यकता है। (मैं जीडब्ल्यूटी-प्लेटफ़ॉर्म का उपयोग कर रहा हूं, लेकिन अवधारणाएं समान हैं।) मैंने अंतिम जावास्क्रिप्ट ऑब्जेक्ट सरणी घोषित की, फिर 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); 
    }); 

}-*/; 
+0

क्या आप कुछ और कोड दिखा सकते हैं? मुझे उन हिस्सों में दिलचस्पी है जो इस कोड को कॉल करते हैं, और वे हिस्सों जो जावास्क्रिप्ट ऑब्जेक्ट का उपभोग करते हैं जो 'doGetWhereAmIMarker (...)' से वापस आती है। –

+0

कॉलिंग मूल विधि जोड़ा गया। GoogleMapUtil https://github.com/dartmanx/mapmaker/blob/master/src/main/java/org/jason/mapmaker/client/util/GoogleMapUtil.java पर है, लेकिन createMarker() विधि के साथ प्रतिबद्ध नहीं है ।यह createMarkerArray() विधि के समान है, हालांकि। – Jason

+0

यदि आप थोड़ी देर (asyncIsDone) {sleep} डालते हैं तो यह क्यों काम नहीं करता है। ऐसा करने के लिए सबसे सरल बात की तरह लगता है ... या इसे() {नींद} के लिए एक निश्चित समय बीतने के बाद जारी रहेगा? – Rohan

उत्तर

3

किसी बिंदु पर मुझे कुछ ऐसा करना पड़ा लेकिन आखिर में मैंने उस कोड को एसिंक्रोनस सामान के पक्ष में हटा दिया। इसलिए, मैं सटीक कोड नहीं दे सकता जिसे आपको उपयोग करने की आवश्यकता है लेकिन केवल कुछ पॉइंटर्स इसे कैसे पहुंचे।

  • सबसे पहले, this blog जावास्क्रिप्ट का उपयोग कर सिंक्रोनस AJAX को कैसे करना है इसका वर्णन करता है।
  • दूसरा, आपको सिंक कॉल के लिए समर्थन प्रदान करना होगा। समस्या यह है कि जीडब्ल्यूटी पैरामीटर का समर्थन नहीं करता है जो सिंक्रोनस AJAX कॉल प्रदान करता है। सबसे अधिक संभावना है कि वे इसके उपयोग को प्रोत्साहित नहीं करना चाहते हैं। इसलिए आपको XMLHttpRequest (जिसे आप शायद विस्तारित करेंगे) के लिए उपयुक्त विधि जोड़ने के लिए JSNI का उपयोग करना होगा और फिर RequestBuilder (इसे भी विस्तारित करना चाहिए)।
  • अंत में, विस्तारित RequestBuilder का उपयोग करके अपनी सेवा में संशोधन करें।

((ServiceDefTarget) सेवा) .setRpcRequestBuilder (requestBuilder) की तरह कुछ;

और अंत में - एक ही ब्लॉग पोस्ट से (थोड़ा संदर्भ से बाहर):

एक अनुरोध के खतरे की वजह से

खो रहा है और ब्राउज़र फांसी, तुल्यकालिक जावास्क्रिप्ट लिए अनुशंसित नहीं है (इसके बाद) अनलोड लोड ईवेंट हैंडलर के बाहर कुछ भी।

+0

मैंने मैनुअल सिंक्रोनस AJAX पहले किया है, लेकिन चूंकि यह जीडब्ल्यूटी है, मैं जीडब्ल्यूटी की सीमाओं के साथ फंस गया हूं। मैं डेटा प्राप्त करने के लिए जीडब्ल्यूटी-प्लेटफ़ॉर्म के डिस्पैचएसिंक का उपयोग कर रहा हूं, और मैं अनुरोधबिल्डर का उपयोग करके वहां कुछ भी नहीं देख रहा हूं। – Jason

+1

आप जेएसएनआई का उपयोग कर जीडब्ल्यूटी के साथ किसी भी जावास्क्रिप्ट कोड का उपयोग करने में सक्षम होना चाहिए। जब आप RPC से निपटते हैं तो 'RequestBuilder' का आंतरिक रूप से उपयोग किया जाता है। एक बार आपकी सेवा हो जाने के बाद, आप प्रदान किए गए स्निपेट का उपयोग करके अपने कस्टम 'RequestBuilder' को असाइन कर सकते हैं। –

+0

मैं आपके उत्तर को स्वीकार करने जा रहा हूं क्योंकि यह दिलचस्प है और ऐसा कुछ हो सकता है जिसे मुझे किसी दिन आजमाने की ज़रूरत है। हालांकि, मुझे अपनी मूल समस्या का उत्तर मिला जो मुझे एसिंक अनुरोध का उपयोग करने से रोक रहा था। – Jason

0

मैं अपने सभी भाग्य के बारे में सोचो ....
हम Gwt में ऐसा नहीं कर सकते रिस्पांस को पकड़ने और इसे भेजने के लिए, क्योंकि अगली विधि को क्रियान्वित करने, न तो अभी भी प्रतिक्रिया परेशान कर रहा है लेकिन शुरू होता है भेजने के तुरंत बाद अनुरोध है वे टाइमर का उपयोग करने के लिए हमें संतुष्ट करते हैं, मुझे लगता है कि ...

Timer t = new Timer() { 
     @Override 
     public void run() { 
     Window.alert("Nifty, eh?"); 
     } 
    }; 
    t.schedule(5000);