2011-11-13 10 views
54

मैंने कुछ स्थानों में process.nextTick देखा है और यह बता नहीं सकता कि इसका क्या उपयोग किया जा रहा है।प्रक्रिया के लिए उचित उपयोग के मामले क्या हैं। Nxt.js में टिकटें?

Node.js में process.nextTick के मुख्य/उचित उपयोग के मामलों क्या हैं? दस्तावेज़ मूल रूप से कहते हैं कि यह setTimeout करने का एक अधिक अनुकूलित तरीका है, लेकिन इससे अधिक मदद नहीं मिलती है।

मैं बहुत सारी एक्शनस्क्रिप्ट करता था, इसलिए कोड को निष्पादित करने के लिए "अगली फ्रेम तक प्रतीक्षा करने" का विचार कुछ स्तर पर समझ में आता है - यदि आप एनीमेशन चला रहे हैं तो आप इसे हर फ्रेम के बजाय हर फ्रेम को अपडेट कर सकते हैं उदाहरण के लिए मिलीसेकंद। यह भी समझ में आता है जब आप चर के समूह को समन्वयित करना चाहते हैं - आप फ्रेम 1 में चर बदलते हैं, और फ्रेम 2 में परिवर्तन लागू करते हैं। फ्लेक्स ने अपने घटक जीवन चक्र में ऐसा कुछ लागू किया है।

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

+2

हाउटनोड में एक प्रक्रिया है [प्रक्रिया .nextTick() '] (http://howtonode.org/understanding-process-next-tick) –

उत्तर

67

process.nextTick एक कतार में कॉलबैक डालता है। इस कतार में प्रत्येक कॉलबैक ईवेंट लूप के अगले टिक की शुरुआत में निष्पादित हो जाएगा। यह मूल रूप से आपके कॉल स्टैक को साफ़ करने के तरीके के रूप में उपयोग किया जाता है। जब प्रलेखन कहता है कि यह setTimeout जैसा है, तो इसका मतलब यह है कि यह ब्राउज़र में setTimeout(function() { ... }, 1) का उपयोग करने जैसा है। इसमें एक ही उपयोग के मामले हैं।

एक उदाहरण का उपयोग केस होगा, आप किसी ऑब्जेक्ट के लिए एक कन्स्ट्रक्टर बनाते हैं जिसके लिए ईवेंट की आवश्यकता होती है। हालांकि, आप तुरंत उत्सर्जित ईवेंट शुरू नहीं कर सकते हैं, क्योंकि कोड को तत्काल करने के लिए अभी तक घटनाओं से जुड़ने का समय नहीं है। आपका कन्स्ट्रक्टर कॉल कॉल स्टैक में उनके ऊपर है, और यदि आप तुल्यकालिक चीजें करना जारी रखते हैं, तो यह वैसे ही रहेगा। इस मामले में, आप जो भी करने जा रहे थे, उसके आगे बढ़ने से पहले process.nextTick का उपयोग कर सकते हैं। यह गारंटी देता है कि आपके कन्स्ट्रक्टर का उपयोग करने वाले व्यक्ति के पास घटनाओं को बांधने के लिए पर्याप्त समय होगा।

उदाहरण:

var MyConstructor = function() { 
    ... 
    process.nextTick(function() { 
    self._continue(); 
    }); 
}; 

MyConstructor.prototype.__proto__ = EventEmitter.prototype; 

MyConstructor.prototype._continue = function() { 
    // without the process.nextTick 
    // these events would be emitted immediately 
    // with no listeners. they would be lost. 
    this.emit('data', 'hello'); 
    this.emit('data', 'world'); 
    this.emit('end'); 
}; 

उदाहरण मिडिलवेयर इस निर्माता

function(req, res, next) { 
    var c = new MyConstructor(...); 
    c.on('data', function(data) { 
    console.log(data); 
    }); 
    c.on('end', next); 
} 
+0

धन्यवाद आदमी, यह स्पष्ट है। –

+1

इसके अलावा, सेटटाइमआउट बहुत धीमा है। – Parris

+3

"इस कतार में प्रत्येक कॉलबैक ईवेंट लूप के अगले टिक की शुरुआत में निष्पादित हो जाएगा।" मुझे लगता है कि यह अब पूरी तरह सटीक नहीं है। जैसा कि मैं इसे समझता हूं, कतार वर्तमान टिक के अंत में संसाधित की जाती है। "V0.10 में, अगला टिक हैंडलर सी ++ से जावास्क्रिप्ट में प्रत्येक कॉल के ठीक बाद चलाए जाते हैं। इसका मतलब है कि, यदि आपका जावास्क्रिप्ट कोड process.nextTick पर कॉल करता है, तो जैसे ही कोड पूरा होने के लिए कॉलबैक आग लग जाएगा, लेकिन वापस जाने से पहले घटना लूप के लिए। " - [नोड 0.10.0 घोषणा] से (http://blog.nodejs.org/2013/03/11/node-v0-10-0-stable/) –

15

यह बस घटना पाश के अंत में अपने समारोह डालता है का उपयोग कर। आम तौर पर जब आप कुछ भारी सिंक्रोनस प्रोसेसिंग कर रहे होते हैं, तो यह सुनिश्चित करने के लिए कि प्रक्रिया अन्य घटनाओं को अवरुद्ध नहीं करेगी, प्रक्रिया के किसी भी भाग के लिए process.nextTick का उपयोग करना बेहतर है। जब आप ऐसा करते हैं, तो Proess.nextTick और फ़ंक्शन समाप्त होने के बाद, यह http अनुरोधों जैसे अन्य ईवेंट को संसाधित करता है, फिर यह प्रक्रिया तक पहुंच जाता है .next कॉलबैक पर क्लिक करें और इसे निष्पादित करें।

इसके अलावा यदि आप इसे फ़ंक्शन को लगातार चलाने के लिए उपयोग कर सकते हैं, कॉल स्टैक ओवरफ्लो किए बिना!

संपादित करें: अभी node's setImmediate function है कि I/O ईवेंट लंबित होने के बाद शेड्यूल का कार्य चलाना है (जैसे नए वेब अनुरोधों को संभालने की तरह): मैंने use case in the answer of this question समझाया।

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