2013-01-12 29 views
7

स्थिति है:जावास्क्रिप्ट में फ़ंक्शन के निष्पादन समय को कैसे सीमित करें?

उपयोगकर्ता कुछ जेएस-कोड लिखता है और इसे कुछ डेटा (स्थानीय रूप से) पर चलाया जाना चाहिए।

लेकिन कभी-कभी अंतहीन लूप या रिकर्सिव कॉल होते हैं ... यही कारण है कि मुझे फ़ंक्शन के निष्पादन समय को सीमित करने की आवश्यकता है, लेकिन फ़ंक्शन को स्वयं संपादित नहीं करना है (और यदि ऐसा भी है - तो क्या मुझे प्रत्येक अनुक्रम बिंदु के बाद चेक डालना चाहिए? लेकिन क्या रिकर्सिव कॉल के बारे में?)

क्या इस अजीब समस्या के लिए कोई अन्य समाधान हैं? शायद eval कोड के कुछ पार्स पेड़ या ऐसा कुछ दे सकता है?

+0

क्या कोई कारण है कि आप अनंत लूप/रिकर्सन से बचने के लिए निष्पादन को रद्द करने का प्रयास करना पसंद करते हैं? –

+0

जब आप कहते हैं कि यह स्थानीय रूप से कुछ डेटा पर चलता है, तो क्या आप उपयोगकर्ता के मशीन पर या स्थानीय रूप से अपने नियंत्रण में कुछ सर्वर पर इसका मतलब रखते हैं। यदि उत्तरार्द्ध, क्या यह Node.js वातावरण जैसे कुछ में चल रहा है? – DWright

+0

कारण यह है कि स्क्रिप्ट उपयोगकर्ता का कोड निष्पादित करती है, न कि मेरे – user1431314

उत्तर

2

क्या यह ब्राउज़र में या नोड में है?

ब्राउज़र में आप एक 0-दूसरे setTimeout में अपने कोड डाल सकते हैं अप रन पाश मुक्त करने के लिए (और अस्थायी रूप से ब्राउज़र अनवरोधित)

setTimeout(function() { 
    // your code here 
}, 0) 

नोड अधिक सजावटी कुछ है कि इस तरह दिखता है और थोड़ा बेहतर है है :

process.nextTick(function() { 
    // frees up the run loop even faster 
}); 
5

सम्भावित समाधान Web Workers उपयोग कर रहा है। एक वेब कार्यकर्ता एक अलग धागे में शुरू होता है और इसे समाप्त किया जा सकता है।

var worker = new Worker('my_task.js'); 
... 
worker.terminate(); 

डाउनसाइड not all browsers support वेब वर्कर्स है।

+1

वेब वर्कर्स भी डीओएम तत्वों तक नहीं पहुंच सकते हैं। यह एक समस्या हो सकती है, खासकर जब से जाहिर है, यह अज्ञात कोड है। –

+0

नोट: सामान्य रूप से, पृष्ठभूमि धागे-श्रमिकों सहित - डीओएम में हेरफेर नहीं कर सकते हैं। यदि पृष्ठभूमि थ्रेड द्वारा किए गए कार्यों को डीओएम में परिवर्तनों की आवश्यकता होती है, तो उन्हें उस काम को करने के लिए संदेशों को अपने रचनाकारों को वापस पोस्ट करना चाहिए। – asgoth