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.
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
Vous devez vous connecter pour publier un commentaire.
Oui, je sais que-vous le savez - MAIS JAMAIS-JAMAIS-JAMAIS 😉
Non-Bloquant) utilise un flux de contrôle de la bibliothèque
npm nœud-ffi pourrait être une alternative, mais c'est aussi un C(++) AddOn 😉
si votre async est "vraiment laid", regarder dans les CIO et l'Injection de Dépendance pour démêler les spaghettis. Asynchrone PEUT être aussi propre que le code de procédure, sans imbriqués les rappels.
Bien sûr, il existe des modèles qui permettent d'éviter l'imbrication des rappels, mais - comme indiqué dans ma question je voudrais me débarrasser de aucun rappels, même la première.
OriginalL'auteur Mike Bild
J'ai récemment créé plus simple abstraction WaitFor à l'appel asynchrone fonctions en mode de synchronisation (basé sur les Fibres). C'est à un stade précoce, mais fonctionne. Merci d'essayer: https://github.com/luciotato/waitfor
à l'aide de WaitFor votre code sera:
Vous pouvez appeler n'importe quel standard de nodejs fonction async, comme si c'était un sync fonction.
attendre.pour(fn,args...) répond au même besoin que la fonction "sync" dans votre exemple, mais à l'intérieur d'une Fibre (sans blocage du nœud de boucle d'événement)
OriginalL'auteur Lucio M. Tato
Standard propmises et de rendement (générateur de fonctions) feront de ce straigthforward:
http://blog.alexmaccaw.com/how-yield-will-transform-node
http://jlongster.com/A-Study-on-Solving-Callbacks-with-JavaScript-Generators
OriginalL'auteur sibidiba