2013-04-25 8 views
7

को समझने में मुझे यह समझने में समस्या हो रही है कि process.nextTick इसकी बात कैसे करता है। मैंने सोचा था कि मैं समझ गया, लेकिन मैं दोहराने के लिए मैं कैसा महसूस इस काम करना चाहिए नहीं कर पा रहे:node.js इवेंट कतार और process.nextTick

var handler = function(req, res) { 
    res.writeHead(200, {'Content-type' : 'text/html'}); 
    foo(function() { 
     console.log("bar"); 
    }); 
    console.log("received"); 
    res.end("Hello, world!"); 
} 

function foo(callback) { 
    var i = 0; 
    while(i<1000000000) i++; 
    process.nextTick(callback); 
} 

require('http').createServer(handler).listen(3000); 

जबकि foo पाशन है, मैं कई अनुरोध के ऊपर भेज देंगे, यह सोचते हैं कि handlerfoo के पीछे कई बार पंक्ति में लग जाएँगे callback केवल foo समाप्त होने पर ही लगाया जा रहा है।

यदि मैं यह कैसे काम करता है के बारे में सही कर रहा हूँ, मुझे लगता है परिणाम इस तरह दिखेगा:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

लेकिन यह नहीं है, यह सिर्फ अनुक्रमिक है:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

मुझे लगता है कि देख foocallback निष्पादित करने से पहले लौट रहा है, लेकिन ऐसा लगता है कि callback कतार के अंत में, आने वाले सभी अनुरोधों के पीछे लाइन में अगला है। क्या यह काम करता है? शायद मैं समझ नहीं पा रहा हूं कि नोड में इवेंट कतार वास्तव में कैसे काम करता है। और कृपया मुझे here इंगित न करें। धन्यवाद।

उत्तर

2

process.nextTick टिक टिक को अंतिम टिक पर डाल दिया गया है, जिसे टिक कतार के अंत में नहीं किया जा रहा है।

Node.js डॉक (http://nodejs.org/api/process.html#process_process_nexttick_callback) कहते हैं: "यह आम तौर पर किसी अन्य आई/ओ घटनाओं आग से पहले चलाता है, लेकिन कुछ अपवाद हैं।"

सेटटाइमआउट (कॉलबैक, 0) शायद आपके जैसा वर्णन करने जैसा अधिक काम करेगा।

+2

नहीं, 'setTimeout' वैसे ही व्यवहार करता है। मुझे लगता है कि मैं वास्तव में पूछ रहा हूं कि पिछले अनुरोध समाप्त होने से पहले मुझे http अनुरोधों को प्रोसेस करना शुरू करना है। – alf

+0

दरअसल, मुझे एहसास हुआ कि 'सेटटाइमआउट' वही करता है जो मैं खोज रहा था, इसलिए मैं क्षमा चाहता हूं। लेकिन सीपीयू गहन कार्यों और http प्रसंस्करण के अंतःस्थापित होने की अनुमति नहीं देने के लिए 'process.nextTick' वास्तव में क्या है? – alf

+0

"टिक के अंत में नहीं" - तो, ​​क्या ईवेंट कतार के अंत में मनमाने ढंग से कार्य करने का कोई तरीका है? क्या 'सेटटाइमआउट (एफएन, 0)' एक अनुशंसित तरीका है या सिर्फ एक कामकाज है? – incarnate

1

आप निश्चित रूप से दिए गए लिंक fgascon पढ़ना चाहिए, और शायद अधिक पृष्ठभूमि के लिए

https://github.com/joyent/node/issues/3335

प्रक्रिया का उपयोग करें। किसी भी आईओ से पहले कुछ कोड कॉल करना चाहते हैं, लेकिन कॉलिंग संदर्भ लौटने के बाद (आमतौर पर क्योंकि आप एक ईवेंट एमिटर पर श्रोताओं को पंजीकृत करना चाहते हैं और पंजीकरण करने से पहले बनाए गए एमिटर को वापस करने की आवश्यकता है कुछ भी)।

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