2014-09-19 7 views
11

मेरे पास एक AJAX क्रिया है जिसमें शामिल डेटा की मात्रा के आधार पर पूरा करने में कुछ मिनट लग सकते हैं। यदि कोई उपयोगकर्ता निराश हो जाता है और नेविगेट हो जाता है, जबकि यह क्रिया अभी भी चल रही है, तो नियंत्रक के साथ क्या होता है? क्या यह वैसे भी पूरा करता है? क्या यह पता है कि अनुरोध को त्याग दिया जाना चाहिए और नियंत्रक वस्तु का निपटान किया जाना चाहिए?जब कोई प्रतिक्रिया प्राप्त करने से पहले उपयोगकर्ता नेविगेट किया जाता है तो एएसपी.नेट एमवीसी नियंत्रक का क्या होता है?

+3

मुझे लगता है कि सबसे सटीक उत्तर "शायद" है, और दृष्टिकोण "हां" मानना ​​है। सर्वर-साइड कोड का आह्वान किया गया था और प्रसंस्करण कर रहा है। अनुरोध रद्द करना (* यदि * ब्राउजर कुछ भी सर्वर को सूचित करता है) HTTP सर्वर पर वेब सर्वर को सूचित कर सकता है कि इसे रद्द किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि आपका एप्लिकेशन कोड निष्पादित करना बंद कर रहा है। एप्लिकेशन कोड सामान्य रूप से सामान्य रूप से पूर्ण हो सकता है और वेब सर्वर केवल प्रतिक्रिया को अनदेखा कर देगा। या सर्वर क्लाइंट को जवाब दे सकता है और ग्राहक केवल प्रतिक्रिया को अनदेखा कर देगा। किसी भी तरह से, नियंत्रक सामान्य रूप से निपटाया जाता है। – David

+0

_any_ मामले में दृश्य प्रस्तुत किए जाने के बाद निपटान किया जाता है - आपके परिदृश्य में नियंत्रक अभी भी पूरी तरह से दृश्य प्रस्तुत करेगा, लेकिन प्रस्तुत दृश्य क्लाइंट को वापस नहीं भेजा जाएगा। –

+0

निश्चित रूप से नियंत्रक को यह जानने का कोई तरीका नहीं होगा कि उपयोगकर्ता ने वेबसाइट छोड़ दी है और निष्पादन जारी रखेगी। प्रतिक्रिया शायद ब्राउज़र – Catalin

उत्तर

8

यह सर्वर को अनुरोध रद्द नहीं करेगा क्योंकि नेविगेट करने का कार्य उस अनुरोध के संबंध में किसी भी जानकारी को सर्वर पर वापस नहीं भेजता है। क्लाइंट (ब्राउज़र) हालांकि, इसके लिए सुनना बंद कर देगा। अनुरोध समाप्त होने के बाद, भले ही ग्राहक इसके लिए सुन रहा था या नहीं, नियंत्रक आमतौर पर निपटान करेगा जैसा कि आमतौर पर होगा।

इसके साथ, आप फैंसी प्राप्त कर सकते हैं और क्लाइंट साइड पर पेज परिवर्तन के सुनने के संयोजन का उपयोग कर सकते हैं और सर्वर पर AJAX अनुरोध पर abort पर कॉल कर सकते हैं।

This SO question discusses अनुरोध को निरस्त करने के लिए कैसे करें। मैं एक वैरिएबल सेट करने की कल्पना कर सकता हूं जब आप पहली बार AJAX अनुरोध शुरू करते हैं और फिर इसे समाप्त होने पर इसे परेशान करते हैं।

चेतावनी - नीचे

var isProcessing = false; 

var xhr = $.ajax({ 
    type: "POST", 
    url: "myUrl", 
    beforeSend: function(){ 
     isProcessing = true; 
    } 
    complete: function(){ 
     isProcessing = false; 
    } 
}); 

window.onbeforeunload = function(){ 
    if(isProcessing){ 
     xhr.abort(); 
    } 
} 
ऊपर

छद्म कोड अवधारणा के बहुत मूल विचार है, लेकिन शायद आसपास कुछ चेकों होना चाहिए, अगर XHR वस्तु मौजूद है, शायद भी बाँध/window.onbeforeunload में निकल .ajax() आइटम के लिए पहले से भेजें और पूर्ण ऑब्जेक्ट हैंडलर।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। इस SO प्रश्न का उत्तर यह इंगित करता है कि abort() सर्वर-साइड एक्शन को समाप्त नहीं करेगा। क्या यह सच है? http://stackoverflow.com/questions/4551175/how-to-cancel-abort-jquery-ajax-request –

+0

टॉमी ने अपने उत्तर में पोस्ट किए गए प्रश्न के एआरवी वाल्टर की प्रशंसा "नोट, अगर सर्वर पहले से ही प्राप्त हो चुका है अनुरोध है, यह अनुरोध को संसाधित करना जारी रख सकता है (सर्वर के प्लेटफ़ॉर्म के आधार पर) ब्राउज़र अब प्रतिक्रिया के लिए नहीं सुन रहा है। वेब सर्वर को अपने अनुरोध में प्रोसेस को संसाधित करने के लिए कोई विश्वसनीय तरीका नहीं है प्रगति " – CSharper

+1

@ रेसल्ट्रेली - मुझे सी शार्पर से सहमत होना है कि केवल एक निश्चित उत्तर नहीं है। मैं कहूंगा, यह मानना ​​सुरक्षित है कि सर्वर को अनुरोध मिलने के बाद, यह संभवतः ऐसा करने पर जारी रहेगा जो इसे करने के लिए कहा गया था। मुझे लगता है कि वहां मौजूद सभी जानकारी में अंतर ब्राउज़र, सर्वर और कोड से संबंधित है। इसके साथ ही, कार्य और रद्दीकरण टोकन का उपयोग करके अनुरोध को रद्द करने के तरीके पर कुछ स्पैस जानकारी है, हालांकि, मेरे पास अपेक्षाकृत कम अनुभव है। https://github.com/ermagana/AsyncCancelExample – Tommy

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