Toutes les fonctions de rappel de Node.js sont-elles asynchrones?

Je travaille à apprendre Node.js et tout ce que j'entends dans chaque didacticiel est "Node is asynchronous and no-bloocking!"

J'ai entendu dans le navigateur régulier JavaScript que certaines choses telles que les appels AJAX peuvent être effectuées de manière asynchrone ou non bloquante (à l'aide de rappels) … Est-ce vrai également pour Node.js, ou toutes les fonctions de rappel de Node.js sont-elles asynchrones / Non bloquant?

Sont-elles toutes les fonctions de rappel Node.js rendues asynchrones / non bloquantes?

Non. Seule l'E / S est habituellement asynchrone, mais beaucoup d'autres rappels sont synchrones. Vérifiez toujours les documents.

Exemples de fonctions asynchrones:

  • Accès au système de fichiers Async (ils ont des contreparties de synchronisation sans rappels)
  • Timers ( setTimeout )
  • setImmediate , setImmediate
  • La plupart des connexions à la base
  • les connexions de réseau
  • Promesses

Exemples de rappels de synchronisation:

  • EventEmitter (dépend de la date à laquelle l'événement est déclenché)
  • Array iteration methods like forEach
  • Rappels de comparaison de sort tableau
  • Chaîne replace rappels de correspondance

Voir aussi Tous les rappels javascript sont-ils asynchrones? Sinon, comment puis-je savoir qui sont? (Y compris d'autres exemples).

Lorsque vous passez un rappel à une fonction, vous vous attendez à ce que cette fonction appelle votre fonction de rappel à d'autres moments. Cependant, il n'est pas automatiquement asynchrone.

Supposons que j'ai ce code:

 function callSomething(callback) { callback(); } function theCallback() { // Do something time consuming here } callSomething(theCallback); 

Dans ce cas, nous passons un rappel, mais le rappel est appelé immédiatement sur la pile d'appels existante. Ceci est considéré comme une mauvaise pratique et est fortement déconseillé dans Node.js. Si vous souhaitez appeler un rappel assez immédiatement, utilisez process.nextTick() :

 function callSomething(callback) { process.nextTick(callback); } 

La réponse directe à votre question est principalement oui. Lorsque vous spécifiez un rappel pour les fonctions dans Node.js, par convention, ils seront appelés sur un autre appel à un moment ultérieur. Mais si vous utilisez un mauvais code de quelqu'un qui ne savait pas comment suivre cette convention, il n'y a aucune garantie.

Non, ils ne sont pas automatiquement asynchrones. Considérez ce code:

 function foo(array, filter, callback) { var result = [] for (var i = 0; i < array.length; i++) { if (filter(array[i])) result.push(array[i]); } callback(result); } 

Et maintenant, imaginez un programme comme celui-ci:

 foo([ 1, 2, 3, 4 ], function() { while(true); }, console.log); console.log('Blocking?'); 

Si foo serait asynchrone puis Blocking? Apparaîtrait immédiatement, mais ce n'est pas le cas!


Vous pouvez être assez sûr, cependant, que la plupart / la bibliothèque standard prenant un rappel est un code asynchrone non bloquant. La plupart d'entre eux ont également une contrepartie Sync .