Jakie są właściwe przypadki użycia procesu.następny punkt w węźle.js?

Widziałem process.nextTick używany w kilku miejscach i nie wiem Do czego jest używany.

Jakie są główne / właściwe przypadki użycia process.nextTick W Node.js? Dokumenty zasadniczo mówią, że jest to bardziej zoptymalizowany sposób działania setTimeout, ale to niewiele pomaga.

Kiedyś robiłem wiele ActionScript, więc pomysł "czekania do następnej klatki" na wykonanie kodu ma sens na pewnym poziomie - jeśli uruchamiasz animację, możesz ją zaktualizować każdą klatkę, a nie co milisekundę na przykład. Ma to również sens, gdy chcesz koordynować ustawienie kilku zmiennych - zmieniasz zmienne w ramce 1, a zmiany w ramce 2 stosujesz. Flex zaimplementował coś takiego w swoim cyklu życia komponentów.

Moje pytanie brzmi, do czego powinienem używać tego w JavaScript po stronie serwera? Nie widzę żadnych miejsc, w których potrzebowałbyś tego rodzaju precyzyjnej kontroli wydajności / przepływu. Szukam punktu we właściwym kierunku.

Author: Lance Pollard, 2011-11-13

2 answers

process.nextTick oddzwania do kolejki. Każde wywołanie zwrotne w tej kolejce zostanie wykonane na samym początku następnego ticka pętli zdarzenia. Jest zasadniczo używany jako sposób na wyczyszczenie stosu połączeń. Kiedy dokumentacja mówi, że jest to jak setTimeout, oznacza to, że jest to jak użycie setTimeout(function() { ... }, 1) w przeglądarce. Ma te same przypadki użycia.

Przykładowym przypadkiem użycia jest utworzenie konstruktora dla jakiegoś obiektu, który wymaga zdarzeń z nim związanych. Nie możesz jednak od razu zacząć emitować wydarzeń, ponieważ kod tworzący instancję nie miał jeszcze czasu na powiązanie z zdarzeniami. Twoje wywołanie konstruktora jest ponad nimi w stosie wywołań, a jeśli nadal będziesz wykonywać rzeczy synchroniczne, pozostanie to w ten sposób. W tym przypadku, możesz użyć process.nextTick Przed przystąpieniem do tego, co zamierzałeś zrobić. Gwarantuje to, że osoba korzystająca z twojego konstruktora będzie miała wystarczająco dużo czasu, aby powiązać zdarzenia.

Przykład:

var MyConstructor = function() {
  ...
  process.nextTick(function() {
    self._continue();
  });
};

MyConstructor.prototype.__proto__ = EventEmitter.prototype;

MyConstructor.prototype._continue = function() {
  // without the process.nextTick
  // these events would be emitted immediately
  // with no listeners. they would be lost.
  this.emit('data', 'hello');
  this.emit('data', 'world');
  this.emit('end');
};

Przykładowe oprogramowanie pośredniczące wykorzystujące ten konstruktor

function(req, res, next) {
  var c = new MyConstructor(...);
  c.on('data', function(data) {
    console.log(data);
  });
  c.on('end', next);
}
 69
Author: chjj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-12 06:15:31

Po prostu umieszcza twoją funkcję na końcu pętli zdarzeń. Zwykle, gdy wykonujesz ciężkie przetwarzanie synchroniczne, lepiej jest użyć procesu.nextTick dla każdego fragmentu kodu, aby upewnić się, że proces nie blokuje innych zdarzeń. Kiedy to zrobisz, po osiągnięciu proess.nextTick i funkcja kończy się, przetwarza inne zdarzenia, takie jak żądania http, a następnie dociera do procesu.nexttick oddzwania i wykonuje go.

Poza tym, jeśli możesz użyć go do uruchomienia funkcji rekurencyjnie, bez przepełnienia stosu wywołań!

Edit: w tej chwili istnieje funkcja setImmediate węzła , która jest funkcją, która ma być uruchamiana po oczekujących zdarzeniach We/Wy(jak obsługa nowych żądań internetowych): wyjaśniłem przypadek użycia w odpowiedzi na to pytanie .

 15
Author: Farid Nouri Neshat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:54