60 votes

Quels sont les cas d'utilisation appropriés de process.nextTick dans Node.js ?

J'ai vu process.nextTick utilisé à quelques endroits et je ne peux pas vraiment dire à quoi il est utilisé.

Quels sont les cas d'utilisation principaux/proposés de process.nextTick dans Node.js ? Les documents disent essentiellement que c'est une façon plus optimisée de faire setTimeout mais cela n'aide pas beaucoup.

J'ai fait beaucoup d'ActionScript, donc l'idée d'"attendre la prochaine image" pour exécuter du code a du sens à un certain niveau - si vous exécutez une animation, vous pouvez la mettre à jour à chaque image plutôt qu'à chaque milliseconde par exemple. C'est également logique lorsque vous souhaitez coordonner le paramétrage d'un ensemble de variables : vous modifiez les variables à la première image et appliquez les changements à la deuxième image. Flex a mis en œuvre quelque chose de semblable dans le cycle de vie de ses composants.

Ma question est la suivante : à quoi dois-je l'utiliser dans le JavaScript côté serveur ? Je ne vois pas d'endroits où l'on aurait besoin de ce genre de contrôle précis des performances et du flux. Je cherche juste un point dans la bonne direction.

2 votes

72voto

chjj Points 5676

process.nextTick met un callback dans une file d'attente. Chaque callback de cette file sera exécuté au tout début du prochain tick de la boucle d'événement. Il s'agit essentiellement d'un moyen de vider votre pile d'appels. Quand la documentation dit que c'est comme setTimeout ça veut dire que c'est comme si on utilisait setTimeout(function() { ... }, 1) dans le navigateur. Il a les mêmes cas d'utilisation.

Par exemple, vous créez un constructeur pour un objet qui doit être lié à des événements. Cependant, vous ne pouvez pas commencer à émettre des événements tout de suite, car le code qui l'instancie n'a pas encore eu le temps de se lier aux événements. Votre appel au constructeur se trouve au-dessus de lui dans la pile d'appels, et si vous continuez à faire des choses synchrones, cela restera ainsi. Dans ce cas, vous pouvez utiliser un process.nextTick avant de procéder à ce que vous étiez sur le point de faire. Il garantit que la personne qui utilise votre constructeur aura suffisamment de temps pour lier les événements.

Exemple :

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');
};

Exemple d'intergiciel utilisant ce constructeur

function(req, res, next) {
  var c = new MyConstructor(...);
  c.on('data', function(data) {
    console.log(data);
  });
  c.on('end', next);
}

3 votes

De plus, setTimeout est trop lent.

7 votes

"Chaque callback dans cette file d'attente sera exécuté au tout début du prochain tick de la boucle d'événement." Je pense que ce n'est plus tout à fait exact. Si je comprends bien, la file d'attente est traitée à la fin du tick actuel. "Dans la v0.10, les gestionnaires nextTick sont exécutés juste après chaque appel du C++ vers JavaScript. Cela signifie que, si votre code JavaScript appelle process.nextTick, alors le callback se déclenchera dès que le code sera exécuté jusqu'à la fin, mais avant de retourner dans la boucle d'événements." - de Annonce de Node 0.10.0

17voto

Farid Nouri Neshat Points 6895

Il exécute simplement votre fonction à la fin de l'opération en cours, avant les rappels d'E/S suivants. Par documentation vous pouvez l'utiliser pour exécuter votre code après l'exécution du code synchrone de l'appelant, ce qui pourrait vous permettre de donner à l'utilisateur de votre API/librairie la possibilité d'enregistrer des gestionnaires d'événements qui doivent être émis dès que possible. Un autre cas d'utilisation est de s'assurer que vous appelez toujours les callbacks de manière asynchrone pour avoir des comportements cohérents dans différents cas.

Dans le passé, process.nextTick aurait été utilisé pour fournir des opportunités d'exécution d'événements I/O, mais ce n'est plus le cas et setImmediate a été créé pour ce comportement. J'ai expliqué une cas d'utilisation dans la réponse à cette question .

0 votes

"Ça met simplement votre fonction à la fin de la boucle d'événement." - non, nextTick est exécuté à la fin de l'opération en cours, AVANT que la boucle d'événements ne continue.

0 votes

@Marko Merci, désolé c'était l'ancien comportement, que je n'ai pas pris la peine de mettre à jour. Il est maintenant mis à jour, merci pour la remarque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X