2012-01-04 7 views
5

सबसे पहले, मुझे पता है कि एक तुल्यकालिक कॉल कर "गलत" है, और पता है कि "संभव नहीं है"।नकली एक GWT तुल्यकालिक RPC कॉल सब से

लेकिन, एक स्थिति में बहुत जटिल (मुझे नहीं पता कि कैसे समझाया जाए), मुझे सर्वर से प्रतिक्रिया का इंतजार करना होगा, मैं जीडब्ल्यूटी-आरपीसी कॉल के लिए जीडब्ल्यूटी-प्लेटफार्म कमांड कार्यान्वयन का उपयोग कर रहा हूं।

मैं ऐसा करने के लिए "हैक" के कुछ प्रकार के लिए देख रहा था।

अग्रिम धन्यवाद।

+3

ऐसा न करें। अपनी समस्या के लिए एक एसिंक्रोनस समाधान खोजें बेहतर है। –

+3

"सबसे पहले, मुझे पता है कि एक सिंक्रोनस कॉल करना" गलत "है, और पता है कि" संभव नहीं है "।" – caarlos0

+0

यह संभव है, लेकिन यह आसान नहीं है, क्या आप वास्तव में ऐसा करना चाहते हैं? – jusio

उत्तर

5

एक समाधान है लेकिन यह आसान नहीं है (उदाहरण के लिए आप इसे काम करने के लिए एक पैरामीटर नहीं फिसल सकते हैं)। जीडब्ल्यूटी हुड के तहत सामान्य जेएस एक्सएमएलएचटीपीआरक्वेट का उपयोग कर रहा है। GWT में एक उपरिशायी प्रकार के लिए यह com.google.gwt.xhr.client.XMLHttpRequest कहा जाता है। इस वर्ग का उपयोग HTTP पर सर्वर को अनुरोध भेजने के लिए किया जाता है। प्रत्येक JS XMLHttpRequest को पहली बार विधि को खोलकर प्रारंभ किया जाता है। इस विधि में कुछ पैरामीटर हैं, लेकिन तीसरा पैरामीटर निर्दिष्ट करता है कि अनुरोध असीमित होना चाहिए या नहीं। यदि आप इसे गलत में बदलते हैं, तो अनुरोध तुल्यकालिक होगा।

लेकिन GWT-RPC इस वर्ग के सीधे उपयोग नहीं करता है, यह RpcRequestBuilder के माध्यम से इसे का उपयोग कर, और इस वर्ग के XMLHttpRequest का उपयोग नहीं कर रहा है सीधे रूप में अच्छी तरह से, यह RequestBuilder उपयोग कर रहा है।

तो आपको आरपीसीआरक्वेटबिल्डर और अनुरोधबिल्डर का कस्टमाइज़ किया गया संस्करण बनाना है (जो XMLHttpRequest को सिंक्रोनस के रूप में प्रारंभ किया जाएगा) का उपयोग करना होगा।

आप अपने जीडब्ल्यूटी-आरपीसी सेवा उदाहरण में RPCequest बिल्डर को ServiceDefTarget पर कास्ट करके सेट कर सकते हैं।

क्या आप अभी भी सिंक्रोनस जीडब्ल्यूटी-आरपीसी अनुरोध चाहते हैं?

+0

भगवान की मां, कड़ी मेहनत। मैं इसे करने की कोशिश छोड़ देता हूं। मैं आपका जवाब अभी के लिए सही रखूंगा। फिर भी धन्यवाद। – caarlos0

8

आमतौर पर, अपने RPC अनुरोध के onSuccess() समारोह में सामान से निपटने के द्वारा, आप स्वचालित रूप से "सर्वर से प्रतिक्रिया इंतजार" होगा। तो मुझे लगता है कि आप वर्तमान में चल रहे सभी कोड को अवरुद्ध करना चाहते हैं? चूंकि जावास्क्रिप्ट एकल लड़ी है कि आसान नहीं होगा है, वहाँ कोई नींद समारोह है कि सिर्फ कार्यक्रम रुकती है।

लेकिन यह हो सकता है एक टाइमर का उपयोग करके हैक तुम क्या चाहते है कि:

Timer checkRPCResponse = new Timer() { 
     @Override 
     public void run() { 
      if (!serverResponseReceived) { 
       this.schedule(100); 
      } else { 
       proceedWithProgram(); 
      } 
     } 
    }; 
    checkRPCResponse.schedule(100); 

मैं अगर ऊपर के उदाहरण में this.schedule(100) कार्यों प्रयास नहीं किया है, लेकिन आप विचार है, जो एक है मिल जांचें कि सर्वर ने हर 100 एमएस का जवाब दिया है या नहीं। बेशक आप onSuccess() समारोह में serverResponseReceived = true खुद सेट करना होगा। आरपीसी के बाद टाइमर को सही कॉल करें।

+0

मैंने पहले से ही ऐसा कुछ करने का प्रयास किया है, लेकिन यह काम नहीं करता है, क्योंकि मुझे इसे गेटटर में चाहिए। वैसे भी, मैंने सर्वर से प्रतिक्रिया आने से पहले एक घटना को बुलाकर थोड़ा सा काम किया है, और, वर्तमान में मुझे जानकारी की आवश्यकता थी, मैं फिर से सभी विजेट अपडेट करता हूं। यह मेरी समस्या का सबसे अच्छा समाधान नहीं है, लेकिन, मुझे मिला एकमात्र तरीका है ... – caarlos0

0

जीडब्ल्यूटी XMLHttpRequest.open() जो इसके तीसरे पैरामीटर के रूप में सच है जिसका मतलब है कि कॉल असीमित होगा। मैं परीक्षण प्रयोजनों सिर्फ इस तीसरे पैरामीटर के लिए मजबूर हमेशा गलत होने के लिए एक ऐसी ही जरूरत हल:

private static native void fakeXMLHttpRequestOpen() /*-{ 
    var proxied = $wnd.XMLHttpRequest.prototype.open; 

    (function() { 
     $wnd.XMLHttpRequest.prototype.open = 
      function() { 
       arguments[2] = false; 
       return proxied.apply(this, [].slice.call(arguments)); 
      }; 
     })(); 
}-*/; 

fakeXMLHttpRequestOpen() लागू करने के बाद, XMLHttpRequest के किसी भी आगे उपयोग तुल्यकालिक में कार्य करेगा। उदाहरण के लिए:

remoteSvc.getResult(new AsyncCallback<String>() { 
    @Override 
    public void onSuccess(String result) { 
     GWT.log("Service called!"); 
    } 

    @Override 
    public void onFailure(Throwable caught) { 
     GWT.log("Service failed..."); 
    } 
} 

GWT.log("Last message"); 

allways प्रस्तुत करना होगा:

Service called! 
Last message 

XMLHttpRequest.open() विनिर्देश के लिए https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open देखें।

संबंधित मुद्दे