2011-02-17 9 views
5

मैं एक समारोह (जावा में सभी लिखित) से कॉल करने के लिए थे, तो:प्रतिक्रिया के इंतजार के दौरान GWT AsyncCallback निष्पादित करेगा?

public int hello() { 
int a = 1; 
executeCallback(); 
// C: Question lies in this range 
return a; 
} 

public void executeCallback() { 
// A: random code to execute before asynccallback 
    randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess(); 
     onFailure(); 
    }); 
// B: random code to execute after asynccallback 
} 

मैं समझता हूँ कि टिप्पणी एक में सामान पर अमल होगा, और समवर्ती गैर तुल्यकालिक randomMethod निष्पादित करेंगे और बी में टिप्पणी निष्पादित करेंगे ।

मैं सोच रहा था, जबकि यादृच्छिक मोड निष्पादित कर रहा है (यदि इसमें काफी लंबा समय लगता है), तो फ़ंक्शन अपने कॉलर पर वापस आ जाएगा (इस मामले में विधि 'हैलो') और टिप्पणी सी में कोड निष्पादित करना प्रारंभ करें? या निष्पादित करने के लिए यादृच्छिक विधि समाप्त करने के लिए कॉलबैक इंतजार करेगा?

और यदि यह पूर्व है, तो मुझे लगता है कि मुझे टिप्पणी की आवश्यकता है कि यादृच्छिक विधि स्पर्श करने से पहले छूने के लिए स्पर्श करें, मैं यह सुनिश्चित करने के लिए 'प्रतीक्षा' कैसे कर सकता हूं कि यह मामला होगा?

उत्तर

3

जब एसिंक्रोनस विधि कहा जाता है, तो प्रोग्राम उस विधि का इंतजार नहीं करता है, यही कारण है कि उन्हें एसिंक्रोनस कहा जाता है। ऐसा कोई तरीका नहीं है कि randomMethod AsyncCallback पर SUccess या OnFailure विधियों को बी के रूप में प्रतिनिधित्व कोड से पहले निष्पादित किया जाता है .. क्योंकि, ब्राउज़र एक एकल थ्रेड में जावास्क्रिप्ट कोड निष्पादित करता है, निष्पादन कॉलरक विधि समाप्त करने के कॉलर के बाद सफलता या ऑनफेलर विधियों को निष्पादित किया जाता है।

यदि आप कोड बी और कोड सी को यादृच्छिक मोड के बाद निष्पादित कर रहे हैं, तो आपको उन्हें असफल विधि, जैसे कि;

randomClass.randomMethod(int a, int b, AsyncCallback<ReturnType>() { 
     onSuccess() { 
     // B: random code to execute after asynccallback 
     // C: Question lies in this range 
     } 
     } 
     onFailure() 
    }); 
1

1] अतुल्यकालिक संचार समय का एक छोटा सा के लिए इस्तेमाल किया पाने के लिए लग सकता है। आपको याद रखना होगा कि क्लाइंट रिमोट प्रक्रिया के कॉल के ठीक बाद अगला बयान जारी रखता है इससे कोई फर्क नहीं पड़ता कि सर्वर पर प्रक्रिया का निष्पादन कितना समय और क्लाइंट से डेटा ट्रांसमिशन लेता है।

2] आप निष्पादित कर सकते हैं // सी: प्रश्न onSuccess विधि में इस रेंज में निहित है

2

मुझे, निष्पादन मॉडल थोड़ा बताएं कि यह कभी कभी आसान है के रूप में यदि आप जानते हैं कि "पर्दे के पीछे" क्या होता है।

ब्राउज़र द्वारा सभी कोड निष्पादन शुरू किया गया है। यह कुछ घटनाओं पर होता है, उदा। जब पृष्ठ लोड होता है, जब उपयोगकर्ता ने कुछ क्लिक किया है, या जब AJAX प्रतिक्रिया आती है।

तो जीडब्ल्यूटी (या अन्य जावास्क्रिप्ट) एप्लिकेशन लिखते समय आप क्या करते हैं, यह है कि आप हैंडलर पंजीकृत करते हैं, उदा। onModuleLoad() का उपयोग करके, या एक बटन पर क्लिकहैंडलर पंजीकृत करके, या एक AsyncCallback को एक GWT-RPC कॉल पर पंजीकृत करके।

दिलचस्प (और शायद जवाबी सहज ज्ञान युक्त?) बात है, कि जब ब्राउज़र इस तरह के एक हैंडलर कहता है, यह क्रियान्वित किया जाता है जब तक यह खत्म (या एक त्रुटि तब होती है जब तक)। उसके बाद ही, अन्य हैंडलर निष्पादित किए जाएंगे। इसका मतलब यह भी है कि, यदि एक हैंडलर के कोड में अंतहीन पाश होता है, तो अन्य कॉलबैक कभी निष्पादित नहीं होंगे - संपूर्ण ब्राउज़र टैब अवरुद्ध होगा।

तो जब आपकी hello() विधि निष्पादित की जाती है, तो यह कुछ हैंडलर (जैसे मॉड्यूललोड या क्लिकहैंडलर) के हिस्से के रूप में किया जाता है।यह

  • सेट a = 1,
  • तो एक AJAX अनुरोध (randomClass.randomMethod) भेजता है,
  • रजिस्टरों एक और AsyncCallback हैंडलर (याद है। यह सिर्फ एक पंजीकरण है, ब्राउज़र पहले वर्तमान हैंडलर खत्म हो जाएगा, इससे पहले कि यह कर सकते हैं वास्तव में AsyncCallback हैंडलर निष्पादित करने के लिए मिलता है)।
  • बी कार्यान्वित
  • कार्यान्वित एक
  • कॉल पदानुक्रम अप को क्रियान्वित करने पर आगे बढ़ती है जब तक हैंडलर समाप्त हो गया है।
संबंधित मुद्दे