2013-04-25 18 views
7

process.nextTick öğesinin kendi işini nasıl yaptıklarını tam olarak anlamakta zorlanıyorum. Ben anladım ama ben bu çalışması gerektiğini nasıl hissettiğini çoğaltmak gibi olamaz: döngü olduğununode.js olay kuyruğunu ve process.nextTick'i anlama

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, ben handlerfoo arkasında birkaç kez sıraya varsayarak, birkaç istekleri üzerine göndereceğiz callback ile yalnızca foo bittiğinde girilmekte.

Bunun nasıl çalıştığını hakkında doğru isem

, Sonucun aşağıdaki gibi görünecektir varsayalım:

received 
received 
received 
received 
bar 
bar 
bar 
bar 

Ama, sadece sıralı var değildir:

received 
bar 
received 
bar 
received 
bar 
received 
bar 

Görüyorum foo, beklendiği gibi callback yürütülmeden önce dönüyor, ancak callback, satırın sonunda değil, sıradaki tüm isteklerin arkasında, NEXT satırında görünüyor gibi görünüyor. Bu şekilde çalışır mı? Belki de sadece düğümdeki olay kuyruğunun nasıl çalıştığını anlamıyorum. Ve lütfen bana here'u işaret etmeyin. Teşekkürler.

cevap

2

process.nextArama işlemini, onay kuyruğunun sonunda değil, yürütülecek bir sonraki onay üzerine koyun.

Node.js doc (http://nodejs.org/api/process.html#process_process_nexttick_callback) say: "Genellikle başka bir G/Ç olayları ateşlenmeden önce çalışır, ancak bazı istisnalar vardır."

setTimeout (geri arama, 0) açıkladığınız gibi çalışacaktır.

+2

Hayır, 'setTimeout' aynı şekilde davrandı. Sanırım gerçekten önceki bir istek bitmeden önce http isteklerini işleme koymaya nasıl başlayacağımı soruyorum. – alf

+0

Aslında, setTimeout'un tam aradığım şeyi yaptığını anladım, bu yüzden özür dilerim. Ancak, cpu yoğun görevlerin ve http işlemenin araya sokulmasına izin vermediği takdirde, 'process.nextTick' tam olarak nedir? – alf

+0

"işaretin sonunda değil" - böylece, olay kuyruğunun sonunda bir rastgele işlevi itmenin bir yolu var mı? SetTimeout (fn, 0) 'önerilen bir yol mu yoksa sadece bir çözüm mü? – incarnate

1

Kesinlikle sağlanan bağlantı fgascon okumak ve belki

https://github.com/joyent/node/issues/3335 daha arka plan için olmalıdır.

process.next Herhangi bir IO'dan önce bazı kodları çağırmak istediğinizde, ancak çağrı bağlamı döndükten sonra (genellikle bir olay yayıcısına dinleyicileri kaydetmek istediğiniz ve kayıt yapabilmeniz için önce oluşturulmuş yayıcıyı geri göndermeniz gerektiğinden dolayı) şey).