2012-07-12 17 views
42

jQuery 1.8 के रूप में, async:false का उपयोग jQuery.ajax() से वंचित है।
लेकिन पृष्ठभूमि में चल रहे AJAX संचार के दौरान आप "लोडिंग स्क्रीन" के साथ कितने वेबपृष्ठ देख चुके हैं? मैंने शायद उनमें से हजारों को देखा है।jQuery.ajax() विधि का async विकल्प बहिष्कृत, अब क्या?

मेरा मामला यह है कि मैं एक मोबाइल ऐप लिख रहा हूं जिसे भाषा फ़ाइल लोड करने की आवश्यकता है। और शुरुआत में मैं भाषा फ़ाइल लोड करता हूं और मैं भाषा फ़ाइल से बटन और अन्य जीयूआई तत्वों का पाठ पुनर्प्राप्त करता हूं।

यह मेरे लिए वास्तव में बुरा है। क्योंकि यदि भाषा फ़ाइल गुम है, तो GUI प्रकट नहीं होना चाहिए। तो मैं इसे कैसे हल करूं? मेरे सभी कोड को success कॉलबैक में रखें? यह मेरे लिए एक अच्छा कोडिंग अभ्यास की तरह प्रतीत नहीं होता है। क्या मैं इसे एक और तरीके से हल कर सकता हूं?

+0

आप नए कार्य कर सकते हैं। और उन कार्यों को ऑनसेफ हैंडलर में कॉल करें। यह अभी भी – Sllix

+0

की तरह देखने योग्य है सिंक को बहिष्कृत नहीं किया गया है? –

+2

@ChenKinnrot 'async = false' सिंक है;) –

उत्तर

26

समाधान उपयोगकर्ता को इंटरफ़ेस से इंटरैक्ट करने के लिए मैन्युअल रूप से ओवरले जोड़ने के लिए है, और फिर AJAX क्वेरी करने के बाद इसे हटा दें।

$(function() { 
    show_overlay();   

    $.ajax({ 
     // Query to server 
    }).done(function() { 
     // Verify good data 
     // Do stuff 
     remove_overlay(); 
    }); 
}); 
+0

हाँ .... मैं ऐसा कुछ करने के लिए झुका रहा हूँ। आपके उत्तर के लिए Thx। – Juw

+1

क्या आप समझा सकते हैं कि मैं उस ओवरले को मैन्युअल रूप से कैसे जोड़ूं और हटाऊं? show_overlay() एक फ़ंक्शन नहीं है। क्षमा करें अगर यह सवाल बहुत नोब है लेकिन मैं इस पर नया हूं। –

+1

@ रॉबर्टोसेपुल्वेडा ब्रेवो यह सिर्फ एक उदाहरण है। 'show_overlay()' एक काल्पनिक फ़ंक्शन है जो एक तत्व प्रदर्शित करता है जो इंटरफ़ेस को अस्पष्ट करता है, जैसे एक div जो कुछ सामग्री के साथ उच्च जेड-इंडेक्स के साथ व्यूपोर्ट भरता है। – jurgemaister

0

आप इस फ़ाइल को पाने के लिए AJAX का उपयोग क्यों करेंगे? बस इसे script टैग का उपयोग करके शामिल करें।

किसी भी मामले में, आप अपने सभी कोड को ऑनस पर नहीं डालते - इसके बजाय आप वहां से एक एकल फ़ंक्शन कॉल करते हैं जो आपका कोड चलाना शुरू करता है।

2

मैं शर्त लगा सकता है कि उन लोगों के 1000 पृष्ठों की है की कई वास्तव में यूआई जबकि AJAX कॉल के लिए इंतजार को ब्लॉक नहीं करती। इसके बजाए, संभवतः वे यूआई को कॉल स्क्रीन के समय प्रतीक्षा स्क्रीन के साथ अस्पष्ट करते हैं और उसके बाद प्रतिक्रिया हैंडलर पर इसे हटा देते हैं।

UI को अस्पष्ट करने के कई तरीके हैं (आप केवल एक jQuery UI संवाद का उपयोग कर सकते हैं जो मॉडल पर सेट है और इसमें कोई भाग नहीं है या बंद बटन नहीं है), इसलिए मैं आपको यह निर्णय छोड़ दूंगा। लेकिन कोड के लेआउट कुछ इस तरह होगा:

var someFunction = function() { 

    // any pre-conditions to the logic 
    // obscure the UI here 

    $.ajax({ 
     url: 'ajax/test.html', 
     success: function(data) { 

      // handle the response 
      // show the UI again 

     }, 
     error: function(data) { 

      // handle the response 
      // show the UI again 

     } 
    }); 
} 

मुझे यकीन है कि वहाँ की घटनाओं की है कि आदेश प्राप्त करने के लिए कई तरीके हैं, लेकिन है कि आम विचार है। यूआई को अवरुद्ध करना वास्तव में कभी इरादा नहीं था, और मुझे लगता है कि यह jQuery के लिए में शामिल है, जो कि को हटा देता है। यह अतुल्यकालिक होना है।

+0

लेकिन यदि आप वास्तव में यूआई को अवरुद्ध करना चाहते हैं तो ब्लॉकयूआई प्लगइन का उपयोग करें: http://jquery.malsup.com/block/ – Simon

+0

@ सिमॉन: निश्चित रूप से, यदि आप _really_ करना चाहते हैं। लेकिन इसकी अनुशंसा नहीं की जाती है और, अक्सर नहीं, यह संकेत है कि किसी को अपने दृष्टिकोण को फिर से सोचने की जरूरत है। शायद अपवाद हैं, हालांकि मैं अभी किसी भी बारे में नहीं सोच सकता। आपके उत्तर के लिए – David

+0

Thx डेविड! – Juw

27

मैं इस पैरामीटर के प्रतिवाद के बारे में टिकट में official discussion पढ़ सकते हैं और यहाँ मैं क्या समझ में आ रहा है:

  • समस्या यह है कि सिंक AJAX के लिए Promise रों (1) को लागू करने के लिए उन्हें भूमि के ऊपर देता है।

  • सिंक AJAX के वास्तविक दुनिया के उपयोग के कई मामले हैं, उदाहरण के लिए पेज अनलोड से पहले राज्य को संरक्षित करना। इसलिए, यह कार्यक्षमता रहेगी, लेकिन जिस तरह से आप इसका उपयोग करते हैं, वह बदल सकता है।

  • निकटतम समाधान (1.8 में लैंडिंग) केवल कॉलबैक (लेकिन वादा नहीं) का समर्थन करना है जब asyncfalse है।

निष्कर्ष करने के लिए: async: false का उपयोग कर रखें कि यदि आप करने के लिए है, लेकिन अपनी कमियां (वी एम के अवरुद्ध) से सावधान। चिंता न करें, अगर आपको यह सुविधा कभी भी $.ajax() हटा दी जाती है तो आपको एक विकल्प प्रदान किया जाएगा।

+0

"पेज अनलोड से पहले राज्य को संरक्षित करना" का क्या अर्थ है? मैं सिंक्रोनस AJAX के लिए एक अच्छा उपयोग के बारे में नहीं सोच सकता। – user2867288

+3

@ user2867288, पृष्ठ अनलोड एक घटना है, जो तब होता है जब उपयोगकर्ता ब्राउज़र टैब/विंडो को बंद करने का प्रयास करता है। "संरक्षित राज्य" का अर्थ बहुत सी चीजें हो सकता है: फॉर्म डेटा को स्वत: सहेजना, सर्वर को बताएं कि उपयोगकर्ता इंटरैक्शन पूरा हो गया है, कुछ विश्लेषणात्मक डेटा सबमिट कर रहा है (उदाहरण के लिए उपयोगकर्ता ने पृष्ठ पर कितना समय व्यतीत किया है)। इसके लिए वास्तव में एक उपयोग का मामला है - यही कारण है कि [बीकन एपीआई] (https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon) बनाया गया था। जब उचित क्रॉसब्रोसर समर्थन होता है, तो सिंक्रोनस AJAX की आवश्यकता नहीं होती है। – Infeligo

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