Attendre un async fonction de retour dans Node.js

Censé, j'ai une fonction async dans Node.js fondamentalement quelque chose comme:

var addAsync = function (first, second, callback) {
  setTimeout(function () {
    callback(null, first + second);
  }, 1 * 1000);
};

Maintenant, bien sûr, je peux appeler cette fonction dans un asynchrones style:

addAsync(23, 42, function (err, result) {
  console.log(result); //=> 65
});

Ce que je me pose des questions sur si vous pouvez le faire en quelque sorte à l'appel de cette fonction de façon synchrone. Pour cela, j'aimerais avoir une fonction wrapper sync, qui fait la chose suivante:

var sync = function (fn, params) {
  var res,
      finished = false;

  fn.call(null, params[0], params[1], function (err, result) {
    res = result;
    finished = true;
  });

  while (!finished) {}

  return res;
};

Alors, je serais en mesure d'exécuter addAsync de manière synchrone, en appelant cela de cette façon:

var sum = sync(addAsync, [23, 42]);

Remarque: bien entendu, vous ne seriez pas le travail à l'aide de params[0] et params[1] dans la réalité, mais l'utilisation de la arguments tableau en conséquence, mais je voulais garder les choses simples dans cet exemple.

Maintenant, le problème, c'est que le code ci-dessus ne fonctionne pas. Il vient de blocs, comme le while boucle de blocs et ne libère pas le cas de la boucle.

Ma question est: Est-il possible en aucune façon de faire de cet échantillon exécuter comme prévu?

J'ai déjà expérimenté avec setImmediate et process.nextTick et diverses autres choses, mais non de leur contribué à. Fondamentalement, ce que vous avez besoin est une façon de dire Node.js pour plaire pause la fonction en cours, poursuivre l'exécution de la boucle d'événements, et de revenir à un point plus tard dans le temps.

Je sais que vous pouvez obtenir quelque chose de similaire à l'aide de yield et générateur de fonctions, au moins dans Node.js 0.11.2 et au-dessus. Mais, je suis curieux de savoir si il fonctionne même sans?

Veuillez noter que je suis pleinement conscient de la façon de faire de la programmation asynchrone en Node.js de la boucle d'événement et toutes les choses liées. Je suis aussi parfaitement conscient que l'écriture de code comme ceci est une mauvaise idée, surtout dans Node.js. Et je suis aussi parfaitement conscient que "un actif d'attendre" est une idée stupide. Donc merci de ne pas donner les conseils pour apprendre à le faire de manière asynchrone ou quelque chose comme ça. Je sais qu'.

La raison pour laquelle je demande est juste de la curiosité et le désir d'apprendre.

pas vraiment. si vous "tenir le micro" en tout, il ne peut pas exécuter la fonction de rappel. si il ne peut pas exécuter la fonction de rappel, il ne peut pas définir de res. si vous les laissez sur le tout, de sorte qu'il peut exécuter la fonction de rappel, le flux de glisse de la fonction externe et res retourne avant d'être défini. il y a peut être un MNP outil pour écrire du code COMME ça...
Que voulez-vous dire avec il y a peut être un MNP outil pour écrire du code COMME ça?
pseudo-synchronisation de code qui ressemble de procédure, mais utilise en interne des rappels à l'exécution de vos décrit la logique. je l'ai fait moi-même avec de la jeter et de la Fonction, mais c'est une mauvaise habitude à prendre.
Avez-vous un exemple de code comme ça?
github.com/0ctave/node-sync, davidwalsh.nom/sync-exec, ou le hack, j'ai parlé de: danml.com/pub/sentry.html

OriginalL'auteur Golo Roden | 2013-07-24