2015-10-24 12 views
7

Przeczytałem, że zaznaczenie jest jednostką wykonawczą, w której pętla zdarzeń nodejs decyduje się uruchomić wszystko w swojej kolejce, ale inne niż jawne powiedzenie process.nextTick() jakie zdarzenia powodują, że pętla zdarzeń node.js rozpoczyna przetwarzanie nowego tiku? Czy to czeka na I/O? A co z obliczeniami związanymi z cpu? Czy jest to ilekroć wchodzimy w nową funkcję?Jakie zdarzenia określają, kiedy znacznik kończy się na node.js?

Odpowiedz

0

nextTick rejestruje wywołanie zwrotne, które ma zostać wywołane, gdy aktualnie wykonywana operacja Zwraca kontrolę z powrotem do pętli zdarzeń (np. Kończy wykonywanie). W przypadku operacji związanej z procesorem będzie to miało miejsce, gdy funkcja zostanie zakończona. W przypadku operacji asynchronicznej będzie to miało miejsce, gdy rozpocznie się operacja asynchronizacji i zostanie wykonany dowolny inny bezpośredni kod (ale nie wtedy, gdy sama operacja asynchroniczna zostanie zakończona, co nastąpi w kolejce zdarzeń, gdy zakończy się obsługa z kolejki zdarzeń) .

Z node.js doc for process.nextTick():

Gdy obecny obrót pętli zdarzenie prowadzi do zakończenia, należy wywołać funkcję zwrotną.

To nie jest zwykły alias dla setTimeout (fn, 0), znacznie bardziej wydajny niż . Działa przed każdym dodatkowym zdarzeniem I/O (włączając w to zegary) w kolejnych tickach pętli zdarzeń.

Kilka przykładów:

console.log("A"); 
process.nextTick(function() { 
    // this will be called when this thread of execution is done 
    // before timers or I/O events that are also in the event queue 
    console.log("B"); 
}); 
setTimeout(function() { 
    // this will be called after the current thread of execution 
    // after any `.nextTick()` handlers in the queue 
    // and after the minimum time set for setTimeout() 
    console.log("C"); 
}, 0); 
fs.stat("myfile.txt", function(err, data) { 
    // this will be called after the current thread of execution 
    // after any `.nextTick()` handlers in the queue 
    // and when the file I/O operation is done 
    console.log("D"); 
}); 
console.log("E"); 

wyjściowa:

A 
E 
B 
C 
D 
3

process.nextTick() nie powoduje node.js, aby rozpocząć nową kleszcza. Powoduje, że dostarczony kod czeka na następny znacznik.

ta jest doskonałym źródłem informacji dla zrozumienia go: http://howtonode.org/understanding-process-next-tick

miarę coraz imprez dla kleszcza, nie wierzę, że środowisko wykonawcze zapewnia. Można „fake” to lubią:

var tickEmitter = new events.EventEmitter(); 
function emit() { 
    tickEmitter.emit('tick'); 
    process.nextTick(emit); 
} 
tickEmitter.on('tick', function() { 
    console.log('Ticked'); 
}); 
emit(); 

Edycja: Aby odpowiedzieć na niektóre inne pytania, kolejny post ma wyjątkowe zadanie wykazanie: What exactly is a Node.js event loop tick?

Powiązane problemy