2012-11-17 20 views
6

के लिए प्रतीक्षा करते समय जावास्क्रिप्ट को कैसे चलाएं मैं सर्वर पर AJAX कॉल कर रहा हूं। जिस कोड को चलाने की आवश्यकता है उसे 3 समूहों में विभाजित किया जा सकता है।AJAX कॉलबैक

  1. कोड ajax फोन किया
  2. कोड के बाद ajax कॉल वापस आ गया है चलाने की जरूरत है (json वस्तु सर्वर करने के लिए जा तैयारी कर) इन्स से पहले चलाने की जरूरत है (का उपयोग करता है क्या से वापस भेज दिया गया सर्वर)
  3. कोड जो उस समय के बीच चलने की आवश्यकता है जब उपयोगकर्ता बटन दबाता है और सब कुछ पूरा हो जाता है। इस कोड को लौटा जेसन ऑब्जेक्ट की आवश्यकता नहीं है।

AJAX कॉल करने के बाद समूह 3 में कोड चलाने के लिए आदर्श होगा और परिणाम सबसे अच्छा उपयोगकर्ता अनुभव और प्रदर्शन प्राप्त करने के लिए वापस आ जाएंगे।

क्या यह किया जा सकता है?

कैसे?

+1

क्या आपने दस्तावेज़ पढ़ने की कोशिश की ?? आपके सभी मामलों के लिए स्पष्टीकरण हैं http://api.jquery.com/jQuery।ajax/ – charlietfl

उत्तर

9

बहुत बस:

function someFunction() { 
    //1. code that needs to run before ajax 
    $.ajax({...}).done(function() { 
     //2. code that needs to be run after the ajax call has returned 
    }); 
    //3. code that needs to be run between the time the user presses 
    // a button and the time everything is done. 
} 

यह काम करता है क्योंकि JavaScript निष्पादन में तुल्यकालिक है (जब तक मजदूरों इस्तेमाल किया जा रहा है, लेकिन है कि इस विशेष मुद्दे से संबंधित न हो)। कोड का पहला बिट चलाएगा, फिर AJAX कॉल ब्राउज़र को XHR अनुरोध शुरू करने के लिए बताएगा, लेकिन someFunction समाप्त नहीं हुआ है, इसलिए यह सिंक्रनाइज़ निष्पादित करना जारी रखेगा।

एक बार someFunction किया जाता है, तो नियंत्रण प्रवाह किसी भी एसिंक्रोनस घटनाओं के लिए खोला जाएगा, अंततः done कॉलबैक की ओर जाता है।

निष्पक्ष होने के लिए, अधिकांश लोगों के लिए अपने सिर को लपेटने के लिए असीमित घटना-उन्मुख प्रोग्रामिंग आसान नहीं है। ट्रैक को खोना आसान है कि किस समय क्या कोड होना चाहिए।

यहाँ कैसे अतुल्यकालिक व्यवहार में काम करता है के एक सहज निष्पादन योग्य उदाहरण है:

(function() { 
    alert(1); 
    setTimeout(function() { 
     alert(2); 
    }, 0); //note the 0ms delay 
    alert(3); 
}()); 

अलर्ट के आदेश 1, 3, 2 हो जाएगा। setTimeout अपने कॉलबैक को समकालिक रूप से कॉल नहीं करेगा क्योंकि यह निर्दिष्ट समय की प्रतीक्षा करने के लिए निश्चित समय की प्रतीक्षा करने पर निर्भर करता है, इसलिए यदि कोई समय समाप्त नहीं होने वाला है, तो भी इसे जारी रखने से पहले वर्तमान फ़ंक्शन को समाप्त करना होगा।

+0

+1 - यह ऐसा कुछ है जो कई डेवलपर्स को परेशान करने में परेशानी होती है। – dtbarne

+0

'// 3' वास्तव में' // 2' से पहले चलाने की गारंटी है? कहें कि '// 3' में बहुत से फ़ंक्शन हैं जो गणना/पूर्ण करने में लंबा समय लेते हैं,' // 2' सैद्धांतिक रूप से '// 3' में जो भी हो, उसके निष्पादन के दौरान कॉल स्टैक में किसी भी बिंदु पर कूद नहीं सकते? मैं asynchrous कॉल मतलब यह नहीं है, मैं सिर्फ सोच रहा हूँ कि जब '// 2' है कार्यक्रम चालित घटना हो सकता है संभवतः निष्पादन में किसी भी बिंदु पर आग। – Jan

+0

@ जेन, एसिंक घटना का "फायरिंग" बस निष्पादन प्रवाह * कतार * में फ़ंक्शन कॉल जोड़ रहा है। कतार अगले समारोह कॉल केवल एक बार पहले से पंक्तिबद्ध कार्यों पूरी तरह से समाप्त निष्पादन है पर जाता है। फ़ंक्शन कॉल को अंतःस्थापित करना संभव नहीं है जब तक कि वे स्पष्ट रूप से श्रमिकों के साथ बहु-थ्रेडिंग का उपयोग न करें। – zzzzBov

0

क्लाइंट ईवेंट या किसी अन्य परिदृश्य में प्रतिक्रिया करते समय एजेक्स कॉल निष्पादित करने से आप कॉलबैक में कोड निर्दिष्ट कर सकते हैं और साथ ही कोड जो AJAX कोड (कॉलबैक में नहीं) के तुरंत बाद निष्पादित करता है।

उदाहरण:

// Code before the ajax call is made 
$.ajax({ 
    params, //other key values such as data 
    success: function (data) { 
     // one of the possible callbacks 
    } 
}); 
// Code executed immediately after ajax call is performed 
// This is executed before or after the callback is complete 
// In most cases it's before 

तो कुछ भी करने से पहले ajax कॉल किया जाता है से पहले निष्पादित करने के लिए गारंटी है निष्पादित। AJAX कॉल के तुरंत बाद कुछ भी कॉलबैक कहने से पहले निष्पादित करने की लगभग गारंटी है। सर्वर प्रतिक्रिया के बाद कॉलबैक निष्पादित करने की गारंटी देता है।

+0

, मैं कॉलबैक अपनी पूर्ण होने से पहले ऐसा नहीं हो सकता के रूप में इस downvote जा रहा था, "यह पहले या बाद में कॉलबैक पूरा हो गया है निष्पादित किया जाता है", लेकिन फिर मुझे याद है यह एक तुल्यकालिक कॉलबैक बनाना संभव है अगर यह एक विकल्प के रूप में इस्तेमाल कर रहा है । मुझे यकीन है मुझे पसंद है आप इसे कैसे शब्दों में किया है या नहीं के रूप में यह संकेत मिलता है कि एक async कॉलबैक से पहले नियंत्रण प्रवाह जारी किया गया था हो सकता है, जो यह नहीं होगा। – zzzzBov

+0

@zzzzBov तुम भी async कोड के बाद एक async कोड हो सकता है। तो पहले कॉलबैक से पहले निष्पादित करने की गारंटी नहीं है। यही कारण है कि मेरा जवाब ऐसा है। अगर आपको लगता है कि आप मेरा जवाब सुधार सकते हैं तो संपादित करने के लिए स्वतंत्र महसूस करें :) –

+0

एसिंक कोड (जैसे कि 'सेटटाइमआउट (एफएन, देरी)' की कॉलिंग * किसी भी * एसिंक्रोनस कॉलबैक होने से पहले निष्पादित हो जाएगी। फ़ंक्शन निष्पादित करने के बाद, किसी भी कतारबद्ध फ़ंक्शन को उस क्रम में निष्पादित किया जाएगा जिसमें उन्हें बुलाया गया था। उदाहरण के लिए, यह आवश्यक है कि 'success' कॉलबैक कैश्ड डेटा का उपयोग करेगा, और अपनी कॉलबैक तुरंत, यह अभी भी होने की * के बाद * वर्तमान में क्रियान्वित समारोह समाप्त हो गया है की गारंटी दी जाएगी कतार संभव है। – zzzzBov

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