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
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
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?