2011-08-11 13 views
6

मैंने डेव हरमन के बहुत रोचक task.js पर एक नज़र डाली।जावास्क्रिप्ट में अजीब उपज वाक्यविन्यास

var [foo, bar] = yield join(read("foo.json"), 
           read("bar.json")).timeout(1000); 

मैं जनरेटर से परिचित हूँ, लेकिन मुझे समझ नहीं आता कैसे उपज अभिव्यक्ति कुछ है कि [foo, बार] को सौंपा जा सकता करने के लिए मूल्यांकन करता है: अपने उदाहरण में वह इस लाइन है। मैं वास्तव में अभिव्यक्ति को कुछ भी असाइन करने की उम्मीद नहीं करता था क्योंकि यह मूल रूप से वापसी के समान ही है।

जेएस के लिए उपज वाक्यविन्यास अभी भी थोड़ा सा दस्तावेज प्रतीत होता है और मुझे इसके बारे में जानकारी नहीं मिल सका।

तो मेरे प्रश्न को स्पष्ट करने के लिए: फू और बार को क्या सौंपा जा रहा है?

+0

BTW मैं एक "taskjs" कीवर्ड जोड़ना चाहते थे लेकिन यह मैं इस के लिए पर्याप्त प्रतिष्ठा नहीं है लगता है। –

+1

कृपया एक प्रश्न पूछना याद रखें :-) – driis

उत्तर

6

वास्तव में, प्रासंगिक पैराग्राफ https://developer.mozilla.org/En/New_in_JavaScript_1.7 में एक छोटे से नीचे है:

एक बार एक जनरेटर अपने next() विधि को फोन करके शुरू कर दिया गया है, आप send() उपयोग कर सकते हैं, एक विशिष्ट मूल्य है कि माना जाएगा गुजर अंतिम yield के परिणामस्वरूप। जनरेटर उसके बाद yield के ऑपरेटिंग वापस करेगा।

मुझे लगता है कि यह केवल प्रासंगिक है अगर जनरेटर अपने तरीकों को सीधे फ़ोन, नहीं द्वारा प्रयोग किया जाता है जब उसके मूल्यों पर पाशन - एक पाश हमेशा जनरेटर पर next() और कभी नहीं send() कॉल करेंगे।

एक तरह से, जेनरेटर निष्पादन सहकारी मल्टीटास्किंग के समान है। जनरेटर निष्पादित करता है जब तक कि yield कथन पाया जाता है। जेनरेटर पर next() या send() कहलाता है, यह नियंत्रण देता है। कॉलर तब जारी रहता है जब तक कि अगले next() या send() कॉल नहीं किया जाता है - अब जनरेटर फिर से निष्पादित हो रहा है। हर बार मूल्यों को आगे और आगे पारित किया जा सकता है।

एक सरल उदाहरण यहाँ:

function gen() 
{ 
    var [foo, bar] = yield 1; 
    console.log("Generator got: " + foo + ", " + bar); 
} 

// This creates a generator but doesn't run it yet 
var g = gen(); 

// Starts generator execution until a yield statement returns a value 
var result = g.next() 
console.log("Received from generator: " + result); 

// Continue generator execution with [2, 3] being the return value 
// of the yield statement. This will throw StopIteration because the 
// iterator doesn't have any more yield statements. 
g.send([2, 3]); 
0

https://developer.mozilla.org/En/New_in_JavaScript_1.7

समारोह उपज कीवर्ड वाली एक जनरेटर है। जब आप इसे कॉल करते हैं, तो इसके औपचारिक पैरामीटर वास्तविक तर्कों से बंधे होते हैं, लेकिन इसके शरीर का वास्तव में मूल्यांकन नहीं किया जाता है। इसके बजाय, जनरेटर-इटरेटर वापस कर दिया जाता है। जेनरेटर-इटरेटर की अगली() विधि के लिए प्रत्येक कॉल पुनरावृत्त एल्गोरिदम के माध्यम से एक और पास करता है। प्रत्येक चरण का मूल्य उपज कीवर्ड द्वारा निर्दिष्ट मान है। उपज के जनरेटर-इटरेटर संस्करण के रूप में उपज के बारे में सोचें, जो एल्गोरिदम के प्रत्येक पुनरावृत्ति के बीच सीमा को इंगित करता है। प्रत्येक बार जब आप अगली() कॉल करते हैं, तो जनरेटर कोड उपज के बाद बयान से फिर से शुरू होता है।

+2

मैं सब समझता हूं कि मुझे समझ में नहीं आ रहा है कि उपज कथन एक लूप में क्यों नहीं होता है (जिसे मैं इटरेटर-शैली अर्थशास्त्र प्राप्त करने की अपेक्षा करता हूं) और क्यों प्रत्यक्ष है जो भी उपज मूल्यांकन करता है उसका उपयोग करके असाइनमेंट किया जाता है। जैसा कि आप कहते हैं, यह एक वापसी की तरह है, इसलिए ऐसा लगता है कि 'var something = कुछ वापस लौटें;'। मैंने कभी उस उपयोग को नहीं देखा है और मुझे यकीन नहीं है कि इसका क्या अर्थ होगा। –

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