2013-06-12 15 views
8

मैं फायरबेस का व्यापक रूप से उपयोग कर रहा हूं और अभी भी केवल एक असली समस्या का सामना कर रहा हूं: ऑन डिस्कनेक्ट मेरे अनुभव में 100% विश्वसनीय नहीं है।फ़ायरबेस पर डिस्कनेक्ट 100% विश्वसनीय नहीं है?

यदि आप पहले विंडो बंद किए बिना कंप्यूटर बंद करते हैं, या ब्राउज़र को मारते हैं, तो आपके पास कभी-कभी "कचरा कलेक्टर" आपके ऑनकनेक्ट को निष्पादित कर रहा है, कभी-कभी ऐसा नहीं होता है। मैं तो बस अब के लिए /.connected का उपयोग न करें, मैं मूल रूप से एक सरल

userRef.set('status', 1); 
userRef.onDisconnect().update({ 'status' : 0 }); 

का उपयोग क्या इस दृष्टिकोण के साथ गलत है:

मेरा प्रश्न पीछा कर रहा है? क्या हम इस बात से सहमत हैं कि लाइन पैरामीटर के समय अद्यतन पैरामीटर सर्वर पर पास किए जाते हैं और विंडो अनलोड से पहले नहीं?

एनबी: मैं 1 में एक बहु खिड़की स्थिति बनाए रखने के लिए, स्थिति रखने के लिए निम्नलिखित दृष्टिकोण का उपयोग करने की कोशिश करना होगा अगर एक और विंडो बंद हो:

userRef.child('status').on('value', function(snap) { 
    if (snap.val() != 1) { 
    userRef.set('status', 1); 
    } 
}); 

मैं यह नहीं चाहता कि यह कैसे हो सकता है संबंधित, लेकिन ...

मेरा समाधान: असल में, मैंने उस हिस्से को अभी याद किया था जहां आप सीखते हैं कि डिस्कनेक्ट केवल एक बार ट्रिगर होता है। लगातार डिस्कनेक्ट करने के लिए, आपको मूल दृढ़ता को लागू करने की आवश्यकता है।

Helpers.onConnected = function(callback) { 
    var connectedRef = lm.newFirebase('.info/connected'); 
    var fn = connectedRef.on('value', function(snap) { 
     if (snap.val() === true) { 
      if (callback) callback(); 
     } 
    }); 
    var returned = {}; 
    returned.cancel = function() { 
     connectedRef.off('value', fn); 
    }; 
    return returned; 
};  

सरल उपयोग के मामले:

 this._onConnected = lm.helpers.onConnected(function() { 
      this.firebase.onDisconnect().update({ 'tu': 0 }); 
     }.bind(this)); 

और फिर रद्द करने के लिए:

 if (this._onConnected) this._onConnected.cancel(); 
     this.firebase.onDisconnect().cancel(); 

उत्तर

5

तुम हमेशा onDisconnect() आपरेशन बुलाना चाहिए इससे पहले कि आप सेट() आपरेशन कहते हैं। इस तरह यदि दोनों के बीच कनेक्शन खो गया है तो आप ज़ोंबी डेटा के साथ समाप्त नहीं होते हैं।

यह भी ध्यान दें कि जिस स्थिति में नेटवर्क कनेक्शन साफ ​​नहीं हुआ है, तो आपको उपयोगकर्ता को पहचानने और डिस्कनेक्ट क्लीनअप को ट्रिगर करने में सक्षम होने से पहले एक टीसीपी टाइमआउट का इंतजार करना पड़ सकता है। सफाई होगी, लेकिन इसमें कुछ मिनट लग सकते हैं।

+2

मुद्दा यह है कि मुझे अभी भी डिस्कनेक्ट पर लगभग 20% मिलता है जिसे दुर्भाग्य से कभी नहीं कहा जाता है, जिसके परिणामस्वरूप लोग हमेशा से जुड़े हुए लगते हैं। क्या आपको यह समझने का कोई तरीका है कि क्या हो रहा है क्योंकि यह 100% सुनिश्चित है कि कम से कम कुछ मिनटों के लिए कनेक्शन अभी भी है जब डिस्कनेक्ट कहा जाता है? – cwehrung

+1

क्लाइंट डिस्कनेक्ट होने के बाद आप कितने समय तक प्रतीक्षा कर रहे हैं? कुछ चरम मामलों में 5 मिनट तक लग सकते हैं। साथ ही - क्या आपके पास शायद ऐसे सुरक्षा नियम हैं जो डिस्कनेक्ट ऑपरेशन को अवरुद्ध कर रहे हैं? एक परीक्षण केस भी सहायक होगा। क्या आपके पास सुपर-सरल परीक्षण केस वाला लिंक है? –

+3

एंड्रयू, मुझे अंत में मेरे मुद्दे का स्रोत मिला। मेरी गलती: मैंने कभी भी एहसास नहीं किया कि डिस्कनेक्ट को केवल पहली बार बुलाया गया था जिसे आप डिस्कनेक्ट कर चुके हैं। यह हमारे पास मौजूद सभी बग बताता है ... मैं निश्चित रूप से इसे आपकी वेबसाइट पर लाल + बोल्ड में डाल दूंगा। – cwehrung

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