2008-10-26 11 views
12

मैं एक setInterval कॉलबैक के भीतर से एक setTimeout कॉल करने के लिए कोशिश कर रहा हूँ के भीतर क्षेत्र से बाहर वार हल करने के लिए कैसे:setTimeout कॉल

function callback() 
{ 
    //assign myVar 
    var myVar = document.getElementById("givenID"); 
    //... 
    //now wait 2 secs then call some code that uses myVAr 
    setTimeout("myVar.innerHTML = 'TEST'", 2000); 
} 

setInterval("callback();", 10000); 

setInterval की उम्मीद है, लेकिन setTimeout कॉल विफल हो रहा है के रूप में काम करता है। मुझे लगता है कि समस्या इस तथ्य से संबंधित है कि मैं एक चर (myVar) का संदर्भ दे रहा हूं जो दायरे में नहीं है।

इसे हल करने का सबसे अच्छा तरीका क्या है?

+0

बंद का उपयोग करना है कि मैं नीचे दिया गया इस पर काम होता है, आंतरिक बंद बाहरी बंद गुंजाइश की पहुंच है। – FlySwat

+0

मुझे कुछ याद आना चाहिए - क्या आप myVar को पूर्ववत करके कुछ प्रदर्शन सहेजने की कोशिश कर रहे हैं? क्यों नहीं सेटटाइमआउट ("document.getElementById (" givenID ")। आंतरिक HTML = 'टेस्ट'", 2000); ? –

+1

setTimout/setInterval के साथ उद्धरणों का उपयोग न करें, यह जेएस रनटाइम को इवल का आह्वान करने के लिए मजबूर करता है, जो कोड को नए संदर्भ में चलाता है, इसलिए दायरा समस्या। – FlySwat

उत्तर

32

इस बंद के लिए एक आदर्श उम्मीदवार हैं:

setInterval(
    function() 
    { 
     var myVar = document.getElementById("givenID"); 
     setTimeout(
      function() 
      { 
       // myVar is available because the inner closure 
       // gets the outer closures scope 
       myVar.innerHTML = "Junk"; 
      },2000); 
    }, 10000); 

आपकी समस्या से संबंधित गुंजाइश है, और यह है कि चारों ओर काम करेगा।

+0

मुझे लगता है कि आप सही हैं - मैंने प्रश्न – JohnIdol

+2

संपादित किया है इस प्रकार एक उत्कृष्ट कारण बताता है कि सेटटाइमआउट के पैरामीटर के रूप में तारों को पारित न करें और सेट अंतराल! :-) –

+0

यकीन है कि एंड्रयू - मैंने आपको वोट दिया :-) – JohnIdol

1

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

इसके अलावा, "someFunction();" को "alert('hi')" (कोई अर्धविराम) के साथ बदलने का प्रयास करें और देखें कि यह काम करता है या नहीं। यदि हां, तो समस्या काफी कम हो गई है।

+0

चीयर्स - मैंने यह किया और देखा कि समस्या सेटटाइमआउट से संबंधित नहीं थी - देखें – JohnIdol

4

सबसे अच्छा अभ्यास के एक मामले के रूप में, setTimeout और setInterval को पैरामीटर के रूप में तार का उपयोग करने के क्योंकि उस eval आह्वान नहीं की कोशिश ... निम्न प्रपत्र का उपयोग करते हुए भी इस समस्या को आसान बना सकता को समझने के लिए/डिबग:

setInterval(function() { 
    // do stuff 
    // ... 
    // now wait 2 secs then call someFunction 
    setTimeout(someFunction, 2000); 
}, 10000); 
+0

महान सुझाव - धन्यवाद – JohnIdol

11

मुझे एक ही समस्या थी। मुद्दा यह था कि मैं एक सेटटाइमआउट() के माध्यम से अपने आप से एक विधि को कॉल करने का प्रयास कर रहा था। कुछ इस तरह, जो मेरे लिए काम नहीं किया:

function myObject() { 

    this.egoist = function() { 
     setTimeout('this.egoist()', 200); 
    } 

} 

myObject001 = new myObject(); 
myObject001.egoist(); 

निम्नलिखित भी काम नहीं किया:

function myObject() { 

    this.egoist = function() { 
     with (this) { setTimeout(function() { egoist() }, 200);} 
    } 

} 

myObject001 = new myObject(); 
myObject001.egoist(); 
:

... setTimeout(egoist, 200); 
... setTimeout(egoist(), 200); 
... setTimeout(this.egoist, 200); 
... setTimeout(this.egoist(), 200); 
... setTimeout(function() { this.egoist() }, 200); 

समाधान तो जैसे के साथ() बयान का इस्तेमाल किया गया

बेशक, यह एक अंतहीन चक्र है, लेकिन जिस बिंदु पर मैं यहां बना रहा हूं वह अलग है।

आशा इस मदद करता है :)

+0

अच्छा, के लिए एक बहुत अच्छा उम्मीदवार है बयान 'के साथ' मेरी राय में के तहत रेटेड .. – Alex

+0

इस मदद की है: डी धन्यवाद –

+2

साथ की खोज " (यह) "मेरा दिन बनाया, धन्यवाद! – WebChemist

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