2014-10-09 16 views
10

Etkinlik döngüsüyle deneme yapıyorum. Önce bir dosyanın içeriğini okumak ve yazdırmak için bu basit kod ile başlar: Node.js olay döngüsünü anlama. process.nextTick() hiç çağrılmadı. Niye ya?

var fs = require('fs'); 
var PATH = "./.gitignore"; 

fs.readFile(PATH,"utf-8",function(err,text){ 
    console.log("----read: "+text); 
}); 

Sonra sonsuz bir döngüye yerleştirin. Bu durumda, readFile işlevi hiçbir zaman yürütülmez. Yanılmıyorsam, Node'un tek iş parçacığı, G/Ç çağrılarının yürütülmesine izin vermeden yinelenmesi nedeniyle gerçekleşir.

while(true){ 
    var fs = require('fs'); 
    var PATH = "./.gitignore"; 

    fs.readFile(PATH,"utf-8",function(err,text){ 
     console.log("----read: "+text); 
    }); 
} 

Yani, G/Ç çağrıları döngü iç içe süreç zaman atanır, böylece bir şey yapmak istiyorum. Ben process.nextTick() ile denedim ama çalışmıyor: Neden çalışmıyor ve edilmez

while(true){ 
    process.nextTick(function(){ 
     fs.readFile(PATH,"utf-8",function(err,text){ 
      console.log("----read: "+text) 
     }); 
    }); 
} 

bunu nasıl yapabilir?

cevap

24

Çünkü while döngüsünüz hala çalışıyor. Sadece bir sonraki kene yapmak için sonsuz şeyler eklemek. Gitmesine izin verirseniz, düğüm işleminiz bellek bittiğinde çökecektir.

Zaman uyumsuz kodla çalıştığınızda, normal döngüleriniz ve denetim yapılarınız sizi hızlandırır. Bunun nedeni, olay döngüsünün bir adımında eşzamanlı olarak yürütmeleridir. Olay döngüsüne tekrar kontrol sağlayan bir şey olana kadar, hiçbir şey 'nextTick' gerçekleşmeyecek.

Böyle düşünün, kodunuz çalışırken olay döngüsünün Pass B'sindesiniz. Eğer listesine foo ekliyoruz

process.nextTick(function foo() { do.stuff(); })' 

çağırdığınızda 'olay döngü C geçmesi başlamadan önce yapılacaklar.' NextTick'i her aradığınızda listeye bir şey daha eklersiniz, ancak senkron kod tamamlanana kadar hiçbiri çalışmaz.

Bunun yerine yapmanız gereken, geri aramalarınızdaki 'bir sonraki şeyi yap' bağlantıları oluşturmaktır. Bağlantılı listeleri düşünün.

// var files = your list of files; 
function do_read(count) { 
    var next = count+1; 
    fs.readFile(files[count], "utf-8", function(err,text) { 
     console.log("----read: " + text); 

     if (next < files.length) { 
      // this doesn't run until the previous readFile completes. 
      process.nextTick(function() { do_read(next) }); 
     } 
    }); 
} 
// kick off the first one: 
do_read(files[0], 0); 

(Açıkçası bu durumu örnekleyen bir örnek olduğunu, ancak fikir)

Bu, her 'Bir sonraki dosyayı' neden kuyruk öncekinin sahip tek sonra yapılacak 'nextTick' eklenecek tamamen işlendi.

TL; DR: Çoğu zaman, önceki şey yardımcı olduğunu

Umut

tamamlanıncaya kadar bir sonraki şeyi yapıyor başlamak istemiyorum!

+1

Mükemmel bir açıklama, teşekkürler JayKuri !! – codependent

+0

çok iyi bir açıklama işlem.nextTick ile ilgili ifadenizi doğrulamak için bazı kanıtlar verebilir. Düğüm veya javascript tarafından herhangi bir belge gibi. –

+0

Mükemmel bir açıklama - şimdi anlayabiliyorum ... – Guihgo

İlgili konular