2010-03-17 21 views
5

मुझे लगता है मैं overtired हो सकता है, लेकिन मैं के लिए मुझे के जीवन इस बात का कोई मतलब नहीं कर सकते हैं और मुझे लगता है कि इन दोनों के साथ जावास्क्रिप्टजावास्क्रिप्ट setTimeout setInterval

var itv=function(){ 
return setInterval(function(){ 
    sys.puts('interval'); 
}, 1000); 
} 
var tout=function(itv){ 
return setTimeout(function(){ 
    sys.puts('timeout'); 
    clearInterval(itv); 
}, 5500); 
} 

के ज्ञान की कमी की वजह से है फ़ंक्शन I

a=tout(itv()); 

और 5.5 सेकंड के लिए चलाने के लिए लूपिंग टाइमर प्राप्त करें और फिर अनिवार्य रूप से बाहर निकलें।



मेरे तर्क के आधार पर यह काम करना चाहिए, लेकिन यह बस

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }); 
}, 5500); 
} 

इस मामले में किसी भी अंतर्दृष्टि की सराहना की होगी नहीं है।

उत्तर

7

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

var dotime=function(){ 
    var iv = setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    return setTimeout(function(){ 
    clearInterval(iv); 
    }, 5500); 
}; 
+0

काम करता है यह निश्चित रूप से यह है। वह टाइमआउट कॉलबैक निष्पादित होने तक अंतराल नहीं बना रहा है। –

+0

जागृत कॉल/संक्षिप्त उत्तर के लिए धन्यवाद, मुझे नहीं पता कि मैं क्या सोच रहा था – dagoof

+0

+1, क्लोजर जादू सबसे अच्छा है। –

4

मुझे लगता है कि आप जो गलती कर रहे हैं वह यह है कि फ़ंक्शन itvsetInterval(function(){ sys.puts('interval'); }, 1000) वापस नहीं आता है, यह setInterval(function(){ sys.puts('interval'); }, 1000) निष्पादित करता है और अंतराल उत्पन्न करता है जो एक आईडी वापस लौटाता है। setInterval(function(){ sys.puts('interval'); }, 1000) क्या कर रहा है रोकने के लिए उस आईडी को clearInterval फ़ंक्शन पर भेज दिया गया है।

संपादित करें: एक समारोह का एक उदाहरण जो काम करेगा।

 
var dotime=function(){ 
// Start our interval and save the id 
var intervalId = setInterval(function(){ 
    // This will get executed every interval 
    sys.puts("interval"); 
}, 1000); 

// Start our timout function 
setTimeout(function(){ 
    // This will get executed when the timeout happens 
    clearInterval(intervalId); // Stop the interval from happening anymore 
}, 5500); 
} 
+0

अच्छा, यह – user460114

1

यह एक और तरीका है अपने संस्करण लिखने के लिए है, तो आप देखते हैं कि आप clearInterval, जहां आप इसे एक टाइमर आईडी बीत चुके हैं चाहिए करने के लिए एक समारोह पारित ।

var dotime=function(){ 
var g=function(){ 
    var f=function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    } 
    clearInterval(f); 
} 
return setTimeout(g, 5500); 
} 

यह काम आप फ़ंक्शन को कॉल shoud करने के लिए:

clearInterval(f()); 

या, अपने संस्करण का उपयोग कर:

var dotime=function(){ 
return setTimeout(function(){ 
    clearInterval(function(){ 
    return setInterval(function(){ 
    sys.puts("interval"); 
    }, 1000); 
    }()); 
}, 5500); 
} 

अस्वीकरण: मैं यह परीक्षण नहीं किया।

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