2010-09-02 9 views
15

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

क्या यह संभव है?

धन्यवाद

आगे स्पष्टीकरण: मुझे लगता है कि एनिमेशन करता है एक पुस्तकालय डिबग करने के लिए चाहते हैं। मैं जानना चाहता हूं कि एकाधिक ऑब्जेक्ट्स एनिमेटेड होने पर कई टाइमर बनाए गए हैं या नहीं।

+0

माइक, कृपया आप अधिक जानकारी जोड़ सकते हैं? –

+1

क्या आप सिर्फ टाइमआउट आईडी की एक सूची चाहते हैं? जावास्क्रिप्ट धागे का उपयोग नहीं करता है ... – brad

उत्तर

6

जैसा कि अन्य ने उल्लेख किया है, setTimeout धागा नहीं फैलता है। आप सभी टाइमआउट आईडी (ताकि आप उन्हें, उदाहरण के लिए रद्द कर सकते हैं) की एक सूची चाहते हैं तो नीचे देखें:


मुझे नहीं लगता कि आप कोड जब बदले बिना सभी टाइमआउट आईडी की एक सूची प्राप्त कर सकते हैं वे कहते हैं। setTimeout एक आईडी देता है - और यदि आप इसे अनदेखा करते हैं, तो यह आपकी जावास्क्रिप्ट के लिए पहुंच योग्य नहीं है। (जाहिर है दुभाषिया यह तक पहुँच गया है, लेकिन अपने कोड नहीं करता है।)

आप कोड को बदल सकता है, तो आप ऐसा कर सकते हैं:

var timeoutId = []; 

timeoutId.push(setTimeout(myfunc, 100)); 

... सुनिश्चित करें कि timeoutId वैश्विक क्षेत्र में घोषित किया जाता है बनाना (शायद window.timeoutId = [] का उपयोग करके)।


बस मेरे सिर के ऊपर से, लेकिन reimplement को setTimeout आप इस तरह कुछ करने के लिए चाहते हैं:

var oldSetTimeout = setTimeout; 
setTimeout = function (func, delay) { 
    timeoutId.push(oldSetTimeout(func, delay)); 
} 

यह परीक्षण नहीं किया है, लेकिन यह आप एक प्रारंभिक बिंदु देता है। अच्छा विचार, भेड़िया!

संपादित करें:aularon's answer उपर्युक्त विचार का अधिक पूर्ण कार्यान्वयन देता है।

+3

आप वास्तव में किसी सरणी में आईडी को स्टोर करने के लिए 'setTimeout()' को फिर से परिभाषित कर सकते हैं। इस तरह कोई कोड संशोधित नहीं किया जाना चाहिए, आपको इसे निष्पादित करने से पहले कुछ जावास्क्रिप्ट इंजेक्ट करना होगा। – molf

+0

@molf, आप यह कैसे करते हैं? –

+0

@molf अच्छा बिंदु। – Skilldrick

10

ध्यान दें कि setTimeout() नए धागे नहीं फैलता है। ब्राउज़र साइड स्क्रिप्टिंग न केवल थ्रेडेड है, बल्कि जावास्क्रिप्ट मूल्यांकन पृष्ठ प्रतिपादन (Web Workers अलग) के साथ एक ही थ्रेड साझा करता है।

अतिरिक्त पठन:

आपके पास टाइमर प्रबंधक अपने आप का निर्माण करना चाहते हो सकता है:

var timerManager = (function() { 
    var timers = []; 
    return { 
     addTimer: function (callback, timeout) { 
     var timer, that = this; 
     timer = setTimeout(function() { 
      that.removeTimer(timer); 
      callback(); 
     }, timeout); 
     timers.push(timer); 
     return timer; 
     }, 
     removeTimer: function (timer) { 
     clearTimeout(timer); 
     timers.splice(timers.indexOf(timer), 1); 
     }, 
     getTimers: function() { 
     return timers; 
     } 
    }; 
})(); 

फिर इसका इस्तेमाल इस प्रकार है:

var t1 = timerManager.addTimer(function() { 
    console.log('Timer t1 triggered after 1 second'); 
}, 1000); 

var t2 = timerManager.addTimer(function() { 
    console.log('Timer t2 triggered after 5 second'); 
    console.log('Number of Timers at End: ' + timerManager.getTimers().length); 
}, 5000); 

console.log('Number of Timers at Start: ' + timerManager.getTimers().length); 
कि timerManager कार्यान्वयन ऊपर Array.indexOf() विधि का उपयोग करता

// Number of Timers at Start: 2 
// Timer t1 triggered after 1 second 
// Timer t2 triggered after 5 second 
// Number of Timers at End: 0 

नोट:

ऊपर कंसोल में निम्न परिणाम प्रदर्शित करेगा। इसे जावास्क्रिप्ट 1.6 में जोड़ा गया है और इसलिए सभी ब्राउज़रों द्वारा लागू नहीं किया गया है। हालांकि, आप आसानी से this Mozilla Dev Center article से कार्यान्वयन जोड़कर विधि को जोड़ सकते हैं।

+0

धन्यवाद, मुझे –

+0

पर एक नज़र डालेंगी जॉन रेजिग आलेख बहुत उपयोगी है, शायद अब तक एकल थ्रेड एसिंक्रोनस घटनाओं का सबसे अच्छा स्पष्टीकरण है। उत्कृष्ट कोड के लिए भी धन्यवाद। – Bob

8

अंत में किया, यह मेरे लिए दिलचस्प था तो मैं कुछ के साथ आने की कोशिश कर कुछ समय बिताया है, और here it's

यह ब्राउज़र की setTimeout और window._activeSetTimeouts हैश में मौजूदा सक्रिय कॉल की सक्रिय स्थिति को भरने को ओवरराइड करता है, window._showCurrentSetTimeouts() डेमो समारोह के साथ जो प्रतीक्षा कर रहे हैं वर्तमान setTimeout कॉल प्रदर्शित करता है।

if(typeof window._setTimeout =='undefined') { 
window._setTimeout=window.setTimeout; 

window._activeSetTimeouts={}; 
window._activeSetTimeoutsTotal=0; 
window._setTimeoutCounter=0; 
window._showCurrentSetTimeouts=function() { 
    var tgt=document.getElementById('_settimtouts'); 
    if(!tgt) { 
    tgt=document.createElement('UL'); 
    tgt.style.position='absolute'; 
    tgt.style.border='1px solid #999'; 
    tgt.style.background='#EEE'; 
    tgt.style.width='90%'; 
    tgt.style.height='500px'; 
    tgt.style.overflow='auto'; 
    tgt.id='_settimtouts'; 

    document.body.appendChild(tgt); 
    } 

    tgt.innerHTML=''; 
    var counter=0; 
    for(var i in window._activeSetTimeouts) { 
     var li=document.createElement('LI'); 
     li.innerHTML='[{status}] {delay} ({calltime})<br /><pre style="width: 100%; height: 5em; overflow: auto; background: {bgcolor}">{cb}</pre>'.f(window._activeSetTimeouts[i]); 
     li.style.background=(counter++%2)?'#CCC' : '#EEB'; 
     tgt.appendChild(li); 
    } 
} 
window.setTimeout=function(cb, delay) { 
    var id = window._setTimeoutCounter++; 
    var handleId = window._setTimeout(function() { 
    window._activeSetTimeouts[id].status='exec'; 
    cb(); 
    delete window._activeSetTimeouts[id]; 
    window._activeSetTimeoutsTotal--; 
    }, delay); 

    window._activeSetTimeouts[id]={ 
    calltime:new Date(), 
    delay:delay, 
    cb:cb, 
    status:'wait' 
    }; 
    window._activeSetTimeoutsTotal++; 
    return id; 
} 

//the following function is for easy formatting 

String.prototype.f=function(obj) { 
var newStr=this+''; 
if(arguments.length==1) { 
if(typeof(obj)=='string') { 
    obj={x:obj}; 
} 


for(var i in obj) { 
    newStr=newStr.replace(new RegExp('{'+i+'}', 'g'), obj[i]+''); 
} 
newStr+=''; 

} else { 
    for(var i=0; i<arguments.length; i++) { 
    newStr=newStr.replace('{'+(i+1)+'}', arguments[i]); 
    } 
} 
return newStr; 
} 
} 

//following line for test 
for(var i=0; i<5; i++) setTimeout(window._showCurrentSetTimeouts, 3000*i); 
+1

बहुत अच्छा, आपको सलाम करता है! – Skilldrick

+0

थोड़ा देर हो चुकी है लेकिन उस उत्तर के लिए धन्यवाद, बहुत उपयोगी है। हालांकि, मुझे 'cb();' window.setTimeout' की चौथी पंक्ति में कॉल करना था: सेटटाइमआउट में सबमिट किया गया तर्क कुछ जावास्क्रिप्ट कोड का फ़ंक्शन या स्ट्रिंग प्रस्तुति हो सकता है। – BiAiB

+0

* क्लैप * ... * क्लैप * ... * क्लैप * .. * क्लैप * * क्लैप * * क्लैप * * क्लैप * * प्रशंसा *। गजब का। शेयर करने के लिए बहुत बहुत शुक्रिया! – Mike