2012-10-21 28 views
5

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

while(src == '') 
{ 
    (function(){ 
     setTimeout(function(){ 
     src = $('#currentImage').val(); 
     $("#img_"+imgIdx).attr('src',src); 
     }, 500); 
    }); 
} 

क्यों?

असल में मेरे पास एक छवि है जो गतिशील रूप से बनाई गई है जिसका स्रोत विशेषता समय पर लोड करने में समय लगता है, इसलिए इससे पहले कि मैं इसे प्रदर्शित कर सकूं, मुझे यह जांचना होगा कि यह लोड हो गया है या नहीं, और केवल तभी जब यह पथ $('#currentImage') में उपलब्ध है, तब क्या मैं इसे प्रदर्शित करता हूँ।

इस कोड को ठीक काम किया इससे पहले कि मैं थोड़ी देर के पाश में प्रयोग किया जाता है, और मैं उपयोगकर्ता इंतजार 3 सेकंड लोड हो रहा है तेजी से किया जा सकता है अगर करना है नहीं करना चाहती जब मैं सीधे

setTimeout(function(){ 
    src = $('#currentImage').val(); 
    $("#img_"+imgIdx).attr('src',src); 
}, 3000); 

किया लेकिन, इसलिए मैंने setTimeOut को थोड़ी देर लूप में रखा और इसके अंतराल को छोटा कर दिया, ताकि मैं केवल हर आधे सेकेंड में लोड किए गए पथ की जांच कर सकूं। इसमें गलत क्या है?

+0

नहीं, सेटटाइमआउट फ़ंक्शन को पैरामीटर के रूप में लेता है और बाद में निष्पादित करता है। – jrdn

+0

@jrdn मैं 'सेटटाइमआउट' के अंदर किसी के बारे में बात नहीं कर रहा हूं, मैं बाहर के बारे में बात कर रहा हूं। वास्तव में घोषणा करने वाले बीटीडब्ल्यू की आवश्यकता नहीं है। –

+0

आह। वह भी। तो हाँ, मेरा जवाब गलत है। यह सिर्फ एक सादा पुराना अनंत पाश है! – jrdn

उत्तर

3

सभी को धन्यवाद - सभी सुझावों में मदद मिली। अंत में मैंने setInterval का उपयोग निम्नानुसार किया:

var timer; 
// code generating dynamic image index and doing ajax, etc 
var checker = function() { 
    var src = $('#currentImage').val(); 
    if(src !== '') { 
    $('#img_' + imgIdx).attr('src', src); 
     clearInterval(timer); 
    } 
}; 

timer = setInterval(checker, 500); 
+0

इस अंतराल की पुष्टि वास्तव में मंजूरी दे दी है। ['window.clearInterval'] (https://developer.mozilla.org/en-US/docs/DOM/window.clearInterval) एक 'intervalID' को इसके तर्क के रूप में लेता है और _function_ नहीं। –

+0

मैंने ऐसा भी सोचा ... लेकिन यह काम करता है। सबसे पहले इसे दूसरे जवाब में देखा: http://stackoverflow.com/questions/109086/stop-setinterval-call-in-javascript – user961627

+0

'i = 0; var fn = function() { console.log (++ i); अगर (i> 9) console.log ('समाशोधन'), clearInterval (fn); }; सेट इंटरवल (एफएन, 500); 'हमेशा के लिए चला जाता है। –

5

समस्या यह है कि आप हर आधे सेकेंड की जांच नहीं कर रहे हैं।

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

यदि आप वास्तव में प्रत्येक आधे सेकेंड की जांच करना चाहते हैं, तो इसके बजाय लूप के बिना setInterval का उपयोग करें।

+0

setInterval एक आईडी देता है। जब आप इसे रोकना चाहते हैं, तो स्पष्ट अंतराल (आईडी) का उपयोग करें; – jrdn

+0

https://developer.mozilla.org/en-US/docs/DOM/window.clearInterval – jrdn

+0

स्पष्टीकरण के लिए धन्यवाद। मैं उस सेट अंतराल ब्लॉक तो लेता हूँ? – user961627

9

जबकि लूप परेशानी पैदा कर रहा है, जैसे jrdn इंगित कर रहा है। शायद आप दोनों setInterval और setTimeout को जोड़ सकते हैं और एक बार src भरने के बाद, अंतराल को साफ़ करें। मैंने मदद के लिए यहां कुछ नमूना कोड रखा है, लेकिन मुझे यकीन नहीं है कि यह आपके लक्ष्य को पूरी तरह से फिट करता है:

var src = ''; 
    var intervalId = window.setInterval(
     function() { 

      if (src == '') { 
       setTimeout(function() { 
        //src = $('#currentImage').val(); 
        //$("#img_" + imgIdx).attr('src', src); 
        src = 'filled'; 
        console.log('Changing source...'); 
        clearInterval(intervalId); 
       }, 500); 
      } 
      console.log('on interval...'); 
     }, 100); 

    console.log('stopped checking.'); 

आशा है कि इससे मदद मिलती है।