2012-11-22 15 views
11

मैं एक अनंत लूप में समाप्त होने पर एक टाइमर को फ़ॉलबैक के रूप में उपयोग करना चाहता हूं। ऐसा लगता है कि सेट अंतराल ऐसा करने का सही तरीका है। हालांकि, यह मेरे लिए काम नहीं कर रहा है।जावास्क्रिप्ट सेट अंतराल अलग थ्रेड के रूप में सेट?

मेरे शोध से, ऐसा लगता है कि सेट इंटरवल पृष्ठभूमि में एक अलग धागे में चलना चाहिए, लेकिन मुझे यह नहीं दिख रहा है।

यह व्यवहार क्यों हो रहा है? और मैं इसे कैसे हल करूं?

var time = 0; 
window.setInterval(function(){time++;}, 1000); 
while (true) { 
    //stuff done 
    if (time >= 5) { 
     break; 
    } 
} 

उत्तर

10

ब्राउज़र जावास्क्रिप्ट एक ही थ्रेड में चलता है। तो यदि आप ऐसा कुछ करते हैं जो बहुत अधिक समय लेता है - यह ब्राउज़र को फ्रीज कर देगा।

देखें जॉन Resig अधिक जानकारी के लिए लेख: http://ejohn.org/blog/how-javascript-timers-work/

के बाद आप उस लेख को पढ़ने के आप अपने setInterval कॉलबैक अब लेकिन केवल तब वर्तमान कोड समाप्त हो गया है के बाद 1000ms में चलाने के लिए पंक्तिबद्ध कि मिल जाएगा। अनंत लूप की वजह से यह खत्म नहीं हो सकता है।

4

zerkms सही उत्तर है। लेकिन मैं जोड़ता हूं कि web workers क्लाइंट साइड जावास्क्रिप्ट से कुछ बहु-थ्रेडेड-आश व्यवहार प्राप्त करने का एक तरीका है।

var worker = new Worker('my_task.js'); 
worker.onmessage = function(event) { 
console.log("Called back by the worker!\n"); 
}; 

कर्मचारी पृष्ठभूमि थ्रेड में चलता है, और आप संदेशों का आदान-प्रदान कर सकते हैं और घटनाओं की सदस्यता ले सकते हैं। यह बहुत निफ्टी है।

+0

वेब श्रमिक लिंक के लिए धन्यवाद। क्या मैं सही ढंग से पढ़ता हूं कि कार्यकर्ता के संदेश को अनंत लूप समाप्त होने तक प्रतीक्षा करना है (= ओपी के मुद्दे को हल नहीं करता है)? –

2

जैसा कि पहले से ही कहा गया है - setInterval पर कॉलबैक अनंत लूप खत्म होने तक नहीं चलता है। ऐसा करने के लिए जो आप प्राप्त करने की कोशिश कर रहे हैं - वेब श्रमिकों का उपयोग किए बिना - आपको लूप से समय की जांच करनी होगी:

var start = Date.now(); 
while((Date.now() - start) < 5000){ 
    ... 
} 
संबंधित मुद्दे