2011-02-02 7 views
20

मैंने देखा है कि यदि मैं भविष्य में 1 मिनट के लिए setTimeout सेट करता हूं, और फिर मेरे सिस्टम समय को अतीत में 5 मिनट में बदलता है, तो setTimeout फ़ंक्शन 6 मिनट में ट्रिगर होगा ।जावास्क्रिप्ट सेटटाइमआउट और सिस्टम समय में परिवर्तन समस्याएं

मैंने ऐसा इसलिए किया क्योंकि मैं देखना चाहता था कि सिस्टम घड़ी में डेलाइट बचत परिवर्तन के दौरान क्या होता है।

मेरा जावास्क्रिप्ट वेबपृष्ठ प्रत्येक 5 सेकंड में पृष्ठ को स्वचालित रूप से रीफ्रेश करने के लिए setTimeout फ़ंक्शन का उपयोग करता है, और यदि डेलाइट बचत होती है, तो पृष्ठ की जानकारी एक घंटे तक स्थिर हो जाएगी। क्या आसपास कोई काम है?

संपादित करें: मैं अजाक्स का उपयोग कर पेज अपडेट कर रहा हूं, मैं पूरे पृष्ठ को रीफ्रेश नहीं करना चाहता हूं।

+0

आप किस ब्राउज़र का उपयोग कर रहे हैं? –

+8

जब डेलाइट सेविंग टाइम चेंज होता है, तो यह वास्तव में एक टाइमज़ोन ऑफसेट परिवर्तन होता है, यूटीसी में बदलाव नहीं। आपके द्वारा किए गए परीक्षण में मॉडल नहीं होता है जो वास्तव में होता है यदि डीएसटी सिस्टम द्वारा स्वचालित रूप से संभाला जाता है। [लीप सेकंड] (http://en.wikipedia.org/wiki/Leap_second) अभी भी एक समस्या उत्पन्न कर सकता है, हालांकि, एक स्वचालित समय सिंक्रनाइज़ेशन के रूप में यदि कंप्यूटर की घड़ी वास्तविक समय से दूर हो गई थी (तो यह धीरे-धीरे नहीं होगा समय बदलें)। – PleaseStand

+0

मैंने अभी विंडोज 7 पर आईई 7, आईई 8, आईई 9, फ़ायरफ़ॉक्स और क्रोम में इसका परीक्षण किया है और मुझे आपके द्वारा वर्णित व्यवहार दिखाई नहीं देता है। शायद यह ओएस के लिए विशिष्ट है? – gilly3

उत्तर

4

मैं क्या करूंगा Comet (लंबी मतदान) का उपयोग करने के लिए हर 5 सेकंड में एक नया अजाक्स अनुरोध खोलने से बदल जाएगा। यह एक बेहतर विकल्प है क्योंकि सर्वर नए परिणामों को ब्राउजर पर हर बार ब्राउजर पर धक्का देगा, यह सर्वर की तरफ हर 5 सेकंड या हर बार नई जानकारी उपलब्ध हो सकता है।

वेब सॉकेट का उपयोग करना और धूमकेतु को वापस गिरने के लिए बेहतर होगा। Faye या socket.oi के साथ कार्यान्वित करना आसान है।

अन्य विकल्प हैं, जैसे धूमकेतु ओ एपे।

+0

+1। – Raynos

0

आप इसे करने के लिए मेटा टैग रीफ्रेश का उपयोग कर सकते हैं। इस कोड को पृष्ठ को रीफ्रेश हैं हर 5 सेकंड:

<meta http-equiv="refresh" content="5"> 

जावास्क्रिप्ट प्रश्न का सवाल है, यह अभी जिस तरह ब्राउज़र setTimeout संभालती है हो सकता है। यह ब्राउजर को सेट समय पर कोड निष्पादित करने के लिए कहता है, और फिर जब घड़ी बदलती है, तो घड़ी को बदलने से पहले कोड अभी भी निष्पादित होता है? बस एक अनुमान है, लेकिन अगली बार जब मैं setTimeout का उपयोग करता हूं तो मुझे इसे ध्यान में रखना होगा।

संपादित करें: ठीक है, यह AJAX के लिए काम नहीं करेगा फिर से संपादित करें: यह वास्तव में एक अच्छा सवाल है। मुझे यकीन है कि सेटटाइमआउट फ़ंक्शन जैसा कि मैंने उपरोक्त कहा है, लेकिन वाह, यह एक मस्तिष्क टीज़र है।

+0

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

4

उपयोग setTimeout के बजाय setInterval और अपनी समस्याओं का समाधान होना चाहिए :)

अद्यतन:

तुम सच में या तो setTimeout या setInterval उपयोग नहीं कर सकते हैं, तो आप एक छिपे हुए iframe है कि एक साधारण HTML लोड करता है करने के लिए कोशिश कर सकते पेज जो इस तरह कुछ दिखता है:

<html> 
    <head> 
     <meta http-equiv="refresh" content="300"/> 
     <script> 
      document.domain='same as parent page'; 
      top.ajax_function_you_wish_to_trigger(); 
     </script> 
    </head> 
    <body> 
    </body> 
</html> 

यदि आप भाग्यशाली हैं तो मेटा रीफ्रेश आपको वही समस्याएं नहीं पहुंचाएगा।

एक और समाधान server push के माध्यम से सर्वर पर ईवेंट फायरिंग को स्थानांतरित करना होगा। ऐसा करने के कई कारण नहीं हैं, कम से कम आप घटनाओं को केंद्रीकृत नहीं करेंगे और उन्हें सर्वर पर बोझ बना देंगे, लेकिन इसे अंतिम उपाय माना जा सकता है।

+0

दुर्भाग्यवश इस समस्या को हल नहीं किया। यही होता है। –

+0

असुविधाजनक रूप से सेट अंतराल काफी खराब है। – Raynos

+0

अजीब बात है - आप किस ओएस पर हैं? मैं किसी भी ब्राउज़र में win7 64bit पर setInterval के साथ इस समस्या को पुन: उत्पन्न नहीं कर सकता। Websockets के लिए –

0

आप if (Date in range foo) चेक कर सकते हैं और कर सकते हैं। मूल रूप से जांचें कि वर्तमान समय टिकट दिन के उजाले के समय के 5 सेकंड के भीतर है और फिर setTimeout का उपयोग कर तुरंत पृष्ठ को रीफ्रेश करें।

इस तरह उपयोगकर्ताओं को ज्ञात समय परिवर्तन के पास मामूली परेशानी होती है लेकिन पृष्ठ एक घंटे तक स्थिर नहीं होगा।

1

मुझे हाल ही में इस समस्या का भी सामना करना पड़ा। मेरे मामले में समय परिवर्तन गंभीर वित्तीय नुकसान हो सकता है इसलिए मुझे इसे गंभीरता से लेना पड़ा।

कुछ पृष्ठभूमि:

  • IE और ओपेरा सिस्टम समय परिवर्तन ठीक से हैंडल (setTimeout, setInterval के लिए कोई साइड इफेक्ट)।
  • एफएफ < 4.0 और सभी वेबकिट आधारित ब्राउज़र अतीत में बदलते समय को संभालने में विफल रहता है (जैसा आपने वर्णन किया है)। नोट: क्रोम में टाइमर कुछ समय ~ 2-60 के बाद ही बंद हो जाता है।

मेरा समाधान: समय परिवर्तन जांच को ट्रिगर करने के लिए उपयोगकर्ता इंटरैक्शन (यानी mousemove, mouseove, आदि) से कुछ ईवेंट का उपयोग करें।

Clock.prototype.checkLocalTime = function(){ 
var diff = Date.now()- this.lastTimestamp; 
if (diff < 0 || diff > 20000) { // if time shifted back or more than 20s to the future 
    console.warn('System time changed! By ' + diff + 'ms'); 
    this.restartTimer(); 
    this.getServerTime(); 
} 
this.lastTimestamp = time; 

}

आप मैं टाइमर को पुनः आरंभ और साथ ही सर्वर के साथ समय सिंक्रनाइज़ नोटिस कर सकते हैं।

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