2009-04-02 12 views
33

मेरे पास एक ऐसा एप्लिकेशन है जिसे मैं लिख रहा हूं जो सर्वर में कैश किए गए ऑब्जेक्ट पर डेटा संशोधित करता है। संशोधनों को AJAX कॉल के माध्यम से किया जाता है जो मूल रूप से उस ऑब्जेक्ट के गुणों को अद्यतन करता है। जब उपयोगकर्ता काम कर रहा है, तो मेरे पास मूल 'सहेजें परिवर्तन' बटन है जो उन्हें डेटा को सहेजने और कैश किए गए ऑब्जेक्ट को फ़्लश करने की अनुमति देता है।jQuery अजाक्स कॉल - सफलता पर सेट वैरिएबल वैल्यू

उपयोगकर्ता की सुरक्षा के लिए, मैं उन्हें चेतावनी देना चाहता हूं कि पृष्ठ से दूर नेविगेट करने का प्रयास करें जब सर्वर ऑब्जेक्ट में संशोधनों को सहेजा नहीं गया है। इसलिए, मैंने IsInitialized नामक एक वेब सेवा विधि बनाई है जो परिवर्तनों को सहेजा गया है या नहीं, इस पर आधारित वास्तविक या गलत लौटाएगा। अगर वे सहेजे नहीं गए हैं, तो मैं उपयोगकर्ता को संकेत देना चाहता हूं और उन्हें अपने नेविगेशन अनुरोध को रद्द करने का मौका देना चाहता हूं।

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

////Catches the users to keep them from navigation off the page w/o saved changes... 
window.onbeforeunload = CheckSaveStatus; 
var IsInitialized; 

function CheckSaveStatus() { 

    var temp = $.ajax({ 
     type: "POST", 
     url: "URL.asmx/CheckIfInstanceIsInitilized", 
     data: "{}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(result) { 
      IsInitialized = result.d; 
     }, 
     error: function(xmlHttpRequest, status, err) { 
      alert(xmlHttpRequest.statusText + " " + xmlHttpRequest.status + " : " + xmlHttpRequest.responseText); 
     } 

    }); 

    if (IsInitialized) { 
     return "You currently have unprocessed changes for this Simulation."; 
    } 
} 

मुझे लगता है कि मैं सफलता कॉलबैक को अनुचित तरीके से उपयोग करने का प्रयास कर रहा हूं। मैं सफलता कॉलबैक पर जावास्क्रिप्ट चर कैसे सेट करूं ताकि मैं यह तय कर सकूं कि उपयोगकर्ता को w/सहेजे गए परिवर्तन संदेश को संकेत दिया जाना चाहिए या नहीं?

जैसा कि अभी बताया गया था, मैं एक एसिंक्रोनस कॉल कर रहा हूं, जिसका अर्थ है कि शेष विधि को मेरे विधि रिटर्न से पहले बुलाया जाता है। क्या AJAX कॉल का उपयोग करने का कोई तरीका है, लेकिन अभी भी खिड़की पकड़ो .ऑनलोड घटना? (सिंक्रोनोस AJAX बनाने के बिना)

+0

बस कह रही है कि 5 साल के अतीत से मेरा एक सवाल "डुप्लिकेट के रूप में चिह्नित" किया गया था एक ई-मेल मिला है। "मूल" प्रश्न केवल एक वर्ष पुराना है। गो-टाइम टाइम मशीनें! :) यह एक और गहराई से प्रतिक्रिया है। – Nathan

उत्तर

32

चूंकि आपको अनलोड ईवेंट में इस व्यवहार की आवश्यकता है, इसलिए आपको इसके बजाय एक सिंक्रोनस कॉल करना होगा। हालांकि यह ब्राउजर विंडो/टैब को निर्भर करता है कि कॉल कितनी देर तक ले जाएगा, लेकिन क्योंकि आप प्रभावी रूप से उपयोगकर्ता को विंडो बंद करने से रोकने की कोशिश कर रहे हैं ...

एक सिंक्रोनस कॉल करने के लिए अपने JSON में async: false जोड़ें ।

4

बात यह है कि अजाक्स कॉल का अनुरोध असीमित है। तो जब तक आप जांच कर रहे हों तब तक प्रारंभ किया गया है कॉल अभी तक समाप्त नहीं हुआ है।

मैं सफलता समारोह में अपने व्यवहार को निर्दिष्ट करने का सुझाव देता हूं।

असल में अजाक्स के साथ सिंक्रोनस कॉल होने पर वास्तव में निराश होने की तुलना में असंभव नहीं है।

+0

इस बात पर कोई सुझाव है कि मैं अभी भी उस खिड़की को कैसे पकड़ सकता हूं। अतुल्यकालिक कॉल का उपयोग करके घटना को फिर से लोड करें? – Nathan

2

आप सैद्धांतिक रूप से घटना को मार सकते हैं (झूठी वापसी) और सफलता पर खिड़की बंद कर सकते हैं, लेकिन मुझे लगता है कि आप कुछ उपयोगकर्ताओं द्वारा सेट जावास्क्रिप्ट प्रतिबंधों में भाग लेंगे, और यह भी उन्हें भ्रमित कर दें कि उनकी खिड़की क्यों बंद नहीं हो रही है। इसलिए, मैं Pawel Krakowiak से सहमत हूं, अजाक्स कॉल स्वयं तुल्यकालिक होना चाहिए।

मैं जोड़ूंगा कि आप उपयोगकर्ता को कुछ अधिसूचना देना चाहेंगे कि आप स्थिति पर जांच कर रहे हैं (पॉपअप नहीं, कृपया। विंडो के शीर्ष पर उन अच्छे अधिसूचना बैनर में से एक) और सेट करना सुनिश्चित करें इस स्थिति के लिए कुछ और उचित करने के लिए $ .ajax "टाइमआउट" विकल्प, इसलिए वे खिड़की के बंद होने के लिए हमेशा के लिए इंतजार नहीं कर रहे हैं।

+0

+1, अधिसूचना पर सहमत हुए। अच्छी बात। –

1

ऐसा लगता है कि मेरे लिए सबसे अच्छा तरीका एसिंक का उपयोग करना था: मेरे AJAX कॉल पर झूठा विकल्प। हालांकि मैं ऐसा करने के लिए रशैक की हिचकिचाहट को समझता हूं, मुझे लगता है कि यह स्थिति साधनों को न्यायसंगत बनाती है।

जेर्फ़ द्वारा यह सुनिश्चित करने के लिए भी बहुत अच्छा बिंदु है कि मैं उपयोगकर्ता को अपनी स्थिति को सत्यापित करने की कोशिश कर रहा हूं, जबकि मैं उपयोगकर्ता को लटका नहीं छोड़ता। वह युग्मित w/टाइमआउट विकल्प महत्वपूर्ण है।

टिप्पणी करने वाले सभी लोगों के लिए धन्यवाद।

2

मैं एक ajax अनुरोध की सफलता कॉलबैक के माध्यम से एक डेटा वस्तु के लिए एक गुण सेट करने के लिए प्रयास के साथ एक समान समस्या थी। async: false का उपयोग करके मेरी समस्या को हल नहीं किया गया है, या तो। मैं क्या कर समाप्त हो गया तो जैसे ajax कॉल के बाहर एक setTimeout कॉल का उपयोग करें, और 1 के लिए टाइमआउट मान सेट करने के लिए, था:

function getSessionid() { 
    $.ajax({ 
     type: 'POST', 
     url: 'getSession.php', 
     dataType: 'text', 
     success: function(result){myData.sessionid = result;}, 
     error: function(data) {alert("Error!\n" + data);} 
    }); 
    setTimeout(function() {alert('sessionid = ' + myData.sessionid);},1); 
} 

बस होने कि 1 मिलीसेकंड देरी दुनिया में सभी फर्क पड़ा। इसके बिना, sessionid संपत्ति AJAX कॉल के बाहर सेट नहीं होगी, हालांकि कॉलबैक के भीतर अलर्ट से पता चला है कि यह वास्तव में सेट किया जा रहा था। यह सोचने के लिए कुछ है, क्या आप एक समान समस्या के खिलाफ आना चाहिए।

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