2009-06-25 12 views
16

इस बहुत ही संकलित उदाहरण में, मेरे पास 3 तत्वों के साथ एक सरणी है जिसे मैं .each() विधि का उपयोग कर लूप कर रहा हूं।प्रोटोटाइपजेएस से बाहर निकलना .each() लूप

var vals = $w('foo bar baz'); 

vals.each(function(val) { 
    alert(val); 

    if(val == 'bar') { 
     //This exits function(val) 
     //but still continues with the .each() 
     return; 
    } 
    }); 

मैं आसानी से समारोह से बाहर लौट सकते हैं चाहते प्रत्येक() अगर मैं करने की जरूरत से बुलाया जा रहा है।

मेरा प्रश्न है, मैं फ़ंक्शन के अंदर से .each() लूप से कैसे बाहर निकल सकता हूं .each() कॉल कर रहा है?

उत्तर

32
if(val == 'bar') { 
    throw $break; 
} 

यह आपके द्वारा लिंक किए गए उसी पृष्ठ पर प्रलेखित है। यह विशेष रूप से प्रत्येक समारोह द्वारा संभाला गया अपवाद है। फेंकने पर, यह आपके कार्य को आगे के तत्वों पर बुलाए जाने से रोकता है।

+1

दोह! ऐसा लगता है कि "$ जारी रखें" भी है। –

+3

हालांकि, "$ जारी रखें" को एक साधारण रिटर्न के पक्ष में बहिष्कृत किया गया है। –

+1

मैं यह ध्यान रखना चाहता हूं कि नए दस्तावेज़ पृष्ठ में अब यह जानकारी नहीं है – llamerr

7

आपका सही है, और प्रोटोटाइप ने एक ऑब्जेक्ट बनाया है ($ ब्रेक) जिसे इस कार्यक्षमता को सक्षम करने के लिए प्रत्येक-फ़ंक्शन से फेंक दिया जा सकता है। प्रोटोटाइप एपीआई दस्तावेज़ों के मुताबिक:

ब्रेक का उपयोग करके नियमित लूप को जावास्क्रिप्ट में संक्षिप्त सर्किट किया जा सकता है और बयान जारी रख सकता है। हालांकि, इटरेटर फ़ंक्शंस का उपयोग करते समय, आपका कोड लूप स्कोप से बाहर होता है: दृश्य के पीछे लूपिंग कोड होता है।

आपको समकक्ष (हालांकि कम इष्टतम) कार्यक्षमता प्रदान करने के लिए, प्रोटोटाइप दो वैश्विक अपवाद वस्तुओं, $ ब्रेक और $ जारी रखता है। इन्हें फेंकना एक वेनिला लूप में संबंधित देशी कथन का उपयोग करने के बराबर है। इन अपवादों को प्रत्येक विधि द्वारा आंतरिक रूप से सही ढंग से पकड़ा जाता है।

इसके अलावा, ध्यान दें कि $, वस्तु पदावनत किया गया है जारी है, और अनुकरण करने के लिए एक -statement जारी रखने के बजाय एक वेनिला वापसी कथन का उपयोग करें।

कोड उदाहरण:

var result = []; 
$R(1,10).each(function(n) { 
    if (0 == n % 2) 
    return; // this equals continue 
    if (n > 6) 
    throw $break; 
    result.push(n); 
}); 
// result -> [1, 3, 5] 

आप प्रत्येक कार्य के बारे में अधिक पढ़ सकते हैं: http://www.prototypejs.org/api/enumerable/each

+2

जैसा कि उल्लेख किया गया है, $ जारी रहना बहिष्कृत और बल्कि व्यर्थ है। आप बस वापस आ सकते हैं। –

+0

आप सही हैं। मैं बहुत जल्दी था। सही किया। – PatrikAkerstrand

2

.each() के लिए दस्तावेज़ है कि आप से जुड़ा हुआ के आधार पर, आप एक throw $break; बयान का उपयोग करना चाहिए, इस करना चाहिए आगे पुनरावृत्तियों को समाप्त करने का कारण बनता है।

बस लौटने से इटेटरेटर अगले को जारी रखेगा।

2

उस पृष्ठ से लिंक से, सही तरीका

if(val == 'bar') 
{ 
    throw $break; 
} 

नहीं है?

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