जब उपयोगकर्ता किसी टैब को छोड़ देता है या स्क्रीन बंद कर देता है तो ब्राउज़र थ्रॉटल और वेबसोकेट डिस्कनेक्ट करने का पता कैसे लगाएं? (जावास्क्रिप्ट)


12

प्रसंग

एक गेम को एक प्रगतिशील वेब ऐप के रूप में भेज दिया गया है जिसमें रीयल-टाइम संचार प्राप्त करने के लिए टाइमर ( setTimeout, setInterval) और वेबसोकेट कनेक्शन हैं।

क्या हो रहा है

जब तक यूजर ऐप में रहेगा तब तक सब कुछ ठीक है। लेकिन जब उपयोगकर्ता दूसरे टैब, या किसी अन्य ऐप पर जाता है या स्क्रीन को बंद कर देता है (मोबाइल के मामले में), तो यह "नारकीय अज्ञात" हो जाता है।

  • वेबसोकेट "रुका हुआ" या "बंद" नहीं हो सकता है
  • टाइमर ऐसा लगता है जैसे उन्हें गला घोंटा जा रहा है या बहस की जा रही है।

यह व्यवहार ब्राउज़र और प्लेटफ़ॉर्म पर निर्भर करता है और, शायद, विशेष उपयोगकर्ता के व्यवहार पर भी निर्भर करता है। मुझे लगता है कि बैटरी और / या संगणना को बचाने के लिए ब्राउज़र और OS का अपना जीवनचक्र / तंत्र है।

जब उपयोगकर्ता वापस आता है, तो ऐप एक अज्ञात स्थिति में है और मैं राज्य को ठीक से बहाल करने के लिए संघर्ष कर रहा हूं।

Websockets के बारे में मुझे socket.io और reconnecting-websocket के साथ ऑटो-पुन : संयोजन है लेकिन यह सब कुछ हल करने के लिए पर्याप्त नहीं है।

उत्तर खोज रहे हैं

  • इनके संबंध में विभिन्न ब्राउज़रों के "जीवनचक्र" क्या हैं? क्या यह प्रलेखित है? वे कब बंद और थ्रॉटल करने का निर्णय लेते हैं?
  • वे वेबस्केट्स के लिए वास्तव में क्या करते हैं? ब्राउज़रों सिर्फ उन्हें डिस्कनेक्ट करें?
  • वे टाइमर के लिए वास्तव में क्या करते हैं? वे उन्हें गला घोंटकर मारते हैं या उनकी आलोचना करते हैं या कुछ और?
  • सामान्य रूप से जावास्क्रिप्ट निष्पादन क्या होता है? रोका / नष्ट / गला घोंटा गया?
  • जब यह चीजों को बंद करने जा रहा है तो क्या किसी तरह के ब्राउज़र जीवनचक्र की घटना को हुक करने का कोई तरीका है? केवल एक चीज जो मुझे मिल सकती है वह दृश्यता एपीआई हो सकती है
  • क्या समाधान का परीक्षण करने में सक्षम होने के लिए इस व्यवहार को कृत्रिम रूप से पुन: पेश करने का एक तरीका है? यह डेस्कटॉप पर विशेष रूप से कठिन है। Websockets को बंद नहीं किया जा सकता है और क्रोमियम डेवलपर्स 2014 ((!) से एक समस्या में मदद करने के लिए जल्दी में नहीं लगते हैं : कनेक्शन थ्रॉटलिंग का उपयोग करते समय websockets शामिल नहीं है

  • उपरोक्त के बावजूद, क्या इस समस्या का पता लगाने / हल करने के लिए एक व्यावहारिक क्रॉस-ब्राउज़र समाधान है? (अनुभव से उदाहरण के लिए, डेस्कटॉप पर फ़ायरफ़ॉक्स क्रोम की तुलना में पूरी तरह से अलग व्यवहार करता है, और एक iPhone एक Android पर कहीं अधिक बार डिस्कनेक्ट करेगा)

सम्बंधित लिंक्स


1
यह केवल एक मसौदा wicg.github.io/page-lifecycle है
हीबर्टी

जवाबों:


7

निश्चित रूप से निश्चित नहीं है, लेकिन आप सेवा श्रमिकों का उपयोग कर सकते हैं। जितना मुझे पता है, वे तब भी पृष्ठभूमि में चलते हैं, भले ही आप टैब नहीं खोलते हैं और समाप्त हो जाते हैं यदि आपका टैब बंद हो जाता है।

Btw। ब्राउज़र टैब के जीवनचक्र हर ब्राउज़र पर अलग-अलग प्रतीत होते हैं, क्योंकि प्रत्येक ब्राउज़र इसे अलग-अलग संभालता है। अगर मैं देखता हूं कि ब्राउज़र टैब को फ्रीज कर सकता है अगर ब्राउज़र को अन्य चीजों के लिए अधिक मेमोरी की आवश्यकता होती है।

यहाँ क्रोम से डॉक्स दिए गए हैं ।

मुझे याद आया कि कुछ घटनाएँ हैं, जैसे कि ऑनलोड जो आपको बताता है कि उपयोगकर्ता ने टैब छोड़ा है या फिर से खोल दिया है। आप इन घटनाओं का उपयोग पुनः जोड़ने आदि के लिए कर सकते हैं।


यह एक दिलचस्प विचार है। क्या यह कुछ ऐसा है जिसे आपने साझा करने के लिए कुछ कोड के साथ किया है?
केव

क्षमा करें, मेरे पास अभी एक उदाहरण कोड नहीं है, लेकिन यदि आप सेवा कार्यकर्ताओं की खोज करते हैं, तो ट्यूटोरियल का एक टन है कि उन्हें कैसे सेट किया जाए। केवल एक चीज जो आपको करनी है वह है बस एक छोटा कोड जहां आप अपने ws-server से जुड़ते हैं और console.log()जब आपको ws-server से संदेश मिलते हैं। क्रोम में आप अपने सेवा कार्यकर्ता के कंसोल को खोल सकते हैं और इसलिए यदि आप टैब छोड़ते हैं तो संदेशों को रिवाइव किया जा सकता है।
नौ

0

मैं आपके ऐप को डिज़ाइन करने के तरीके के बारे में अलग-अलग सलाह दूंगा। यदि उपयोगकर्ता ब्राउज़र में अब सक्रिय नहीं है, तो यह समझने के लिए कि आपका इरादा क्या है, मैं अधिक तर्क जोड़ना चाहता हूं। यह एक अलग समस्या है जो उस तर्क को लागू करने के लिए ब्राउज़र की बारीकियों को बताता है। इसे ध्यान में रखते हुए, मैं इसके बजाय सर्वर और क्लाइंट दोनों में बेहतर त्रुटि से निपटने में निवेश करूंगा ।

त्रुटियां ब्राउज़र-विशिष्ट नहीं होंगी। उन लोगों को संभालना आपके ऐप को ब्राउज़र परिवर्तनों के लिए अधिक लचीला और अज्ञेय बना देगा, जो अंततः बदल सकते हैं, आइए कहते हैं, जिस तरह से वे टैब को हाइबरनेट करते हैं, कोई अन्य सुविधा जो एक विक्रेता भविष्य में लागू कर सकता है।

यह एक विचार है जिसे आप सेवाओं की वास्तुकला में पा सकते हैं, लेकिन यही पैटर्न किसी भी वेब-ऐप पर लागू होता है। आप Design-for-Failअवधारणाओं को देखना चाहते हैं:

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

https://www.oreilly.com/library/view/designing-delivery/9781491903742/ch04.html


आप किस तरह की "बेहतर त्रुटि से निपटने" के बारे में सोच रहे हैं?
केव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.