2010-06-10 14 views
78

मैं उदाहरण के बाद स्टार्टपेज पर जाने के लिए एक पृष्ठ बनाने का प्रयास करता हूं। 10sec निष्क्रियता (उपयोगकर्ता कहीं भी क्लिक नहीं कर रहा है)। मैं बाकी के लिए jQuery का उपयोग करता हूं लेकिन मेरे परीक्षण समारोह में सेट/स्पष्ट शुद्ध जावास्क्रिप्ट हैं।सेटटाइमआउट/साफ़टाइमआउट समस्याएं

मेरी निराशा में मैंने इस समारोह की तरह कुछ खत्म कर दिया जो मुझे उम्मीद थी कि मैं पृष्ठ पर किसी भी क्लिक पर कॉल कर सकता हूं। टाइमर ठीक शुरू होता है, लेकिन एक क्लिक पर रीसेट नहीं होता है। समारोह पहले 10 सेकंड में 5 बार कहा जाता है, तो 5 अलर्ट दिखाई देगी ... कोई clearTimeout ...

function endAndStartTimer() { 
    window.clearTimeout(timer); 
    var timer; 
    //var millisecBeforeRedirect = 10000; 
    timer = window.setTimeout(function(){alert('Hello!');},10000); 
} 

किसी भी एक कोड की कुछ पंक्तियाँ है कि चाल करना होगा मिल गया? - किसी भी क्लिक पर रोकें, रीसेट करें और टाइमर शुरू करें। - जब टाइमर हिट उदाहरण के लिए। 10sec कुछ करो।

उत्तर

177

आपको फ़ंक्शन के बाहर "टाइमर" घोषित करने की आवश्यकता है। अन्यथा, आपको प्रत्येक फ़ंक्शन आमंत्रण पर एक नया नया चर मिलता है।

var timer; 
function endAndStartTimer() { 
    window.clearTimeout(timer); 
    //var millisecBeforeRedirect = 10000; 
    timer = window.setTimeout(function(){alert('Hello!');},10000); 
} 
+4

मुझे एक घंटे बचाने के लिए धन्यवाद! –

14

ऐसा इसलिए है क्योंकि टाइमर आपके फ़ंक्शन के लिए एक स्थानीय चर है।

इसे फ़ंक्शन के बाहर बनाने का प्रयास करें।

43

समस्या यह है कि timer चर स्थानीय है, और प्रत्येक कार्य कॉल के बाद इसका मूल्य खो गया है।

आप समारोह के बाहर यह डाल सकते हैं यह जारी रहती है की जरूरत है,, या यदि आप वैश्विक रूप में चर का पर्दाफाश नहीं करना चाहते, तो आप इसे एक closure में स्टोर कर सकते हैं, जैसे:

var endAndStartTimer = (function() { 
    var timer; // variable persisted here 
    return function() { 
    window.clearTimeout(timer); 
    //var millisecBeforeRedirect = 10000; 
    timer = window.setTimeout(function(){alert('Hello!');},10000); 
    }; 
})(); 
3

नहीं यकीन है कि अगर यह कुछ अच्छा अभ्यास कोडिंग नियम का उल्लंघन करती है, लेकिन मैं आम तौर पर इस एक के साथ बाहर आने:

if(typeof __t == 'undefined') 
     __t = 0; 
clearTimeout(__t); 
__t = setTimeout(callback, 1000); 

इस समारोह से बाहर टाइमर घोषित करने के लिए की जरूरत को रोकने के।

संपादित करें: यह प्रत्येक आमंत्रण पर एक नया चर घोषित नहीं करता है, लेकिन हमेशा इसे रीसायकल करता है।

उम्मीद है कि इससे मदद मिलती है।

2

एक तरह से इस में उपयोग करने के लिए प्रतिक्रिया:

class Timeout extends Component { 
    constructor(props){ 
    super(props) 

    this.state = { 
     timeout: null 
    } 

    } 

    userTimeout(){ 
    const { timeout } = this.state; 
    clearTimeout(timeout); 
    this.setState({ 
     timeout: setTimeout(() => {this.callAPI()}, 250) 
    }) 

    } 
} 

सहायक यदि आप केवल एक API कॉल करने के लिए के बाद उपयोगकर्ता उदाहरण के लिए टाइपिंग बंद कर दिया है चाहते हैं। उपयोगकर्ताटाइम फ़ंक्शन को इनपुट पर केएप के माध्यम से बाध्य किया जा सकता है।

+1

यही वह है जो मैं कुछ घंटों के लिए देख रहा हूं, धन्यवाद। मैं बस सोच रहा था कि इस तरह के नतीजे होने का बेहतर तरीका है या नहीं? – nikasv

+1

@nikasv थ्रॉटलिंग, और debouncing दो विकल्प हैं: https://medium.com/@_jh3y/throttling-and-debouncing-in-javascript-b01cad5c8edf –

+1

यह नहीं पता कि यह कैसे हासिल किया जाए यह नौकरी प्रस्ताव लैंडिंग में भाग नहीं है - इसलिए इस दृष्टिकोण को जानना मौलिक माना जाता है। –