Quelle est la manière correcte de la chaîne d'appels asynchrones en javascript?
J'essaie de trouver la meilleure façon de créer des appels asynchrones lors de chaque appel dépend du précédent appel d'avoir terminé. Pour le moment je suis le chaînage des méthodes de manière récursive d'appeler un processus défini en fonction comme illustré ci-dessous.
C'est ce que je suis en train de faire.
var syncProduct = (function() {
var done, log;
var IN_CAT = 1, IN_TITLES = 2, IN_BINS = 3;
var state = IN_CAT;
var processNext = function(data) {
switch(state) {
case IN_CAT:
SVC.sendJsonRequest(url("/api/lineplan/categories"), processNext);
state = IN_TITLES;
break;
case IN_TITLES:
log((data ? data.length : "No") + " categories retrieved!");
SVC.sendJsonRequest(url("/api/lineplan/titles"), processNext);
state = IN_BINS;
break;
case IN_BINS:
log((data ? data.length : "No") + " titles retrieved!");
SVC.sendJsonRequest(url("/api/lineplan/bins"), processNext);
state = IN_MAJOR;
break;
default:
log((data ? data.length : "No") + " bins retrieved!");
done();
break;
}
}
return {
start: function(doneCB, logCB) {
done = doneCB; log = logCB; state = IN_CAT;
processNext();
}
}
})();
Je puis appeler cela comme suit
var log = function(message) {
//Impl removed.
}
syncProduct.start(function() {
log("Product Sync Complete!");
}, log);
Alors que cela fonctionne parfaitement bien pour moi je ne peux pas aider mais pense qu'il y a mieux (plus simple). Ce qui se passe plus tard, lors de mes appels récursifs trop profondément?
NOTE: je ne suis pas à l'aide de javascript dans le navigateur, mais de manière native dans le Titane de cadre, cela s'apparente à du Javascript pour Node.js.
Cette bibliothèque semble brillant pimvdb, je pense que je vais utiliser ce un.
OriginalL'auteur Brett Ryan | 2012-02-24
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup de bibliothèques et d'outils qui ne async chaînage et de contrôle de flux pour vous et pour la plupart ils sont principalement de deux saveurs:
De flux de contrôle bibliothèques
Voir, par exemple,asynchrone, seq et étape (rappel) ou Q et futures (promesse). Le principal avantage de ces derniers est qu'ils sont juste des plaines de bibliothèques JS que soulager la douleur de programmation asynchrone.
Dans mon expérience personnelle, de la promesse à base de bibliothèques ont tendance à conduire à un code qui ressemble plus habituelle du code synchrone, puisque vous les valeurs de retour à l'aide de "retour", et la promesse de des valeurs peuvent être transmises et stockées autour de, de même à la valeur réelle.
D'autre part, la continuation de la base de code est plus faible niveau depuis il manipule les chemins de code explicitement. Cela peut éventuellement permettre plus de souplesse dans le contrôle de flux et une meilleure intégration avec les bibliothèques existantes, mais il peut aussi conduire à plus de boilerplaty et moins intuitif code.
Javascript CPS compilateurs
L'extension de la langue pour ajouter la prise en charge native pour les coroutines/générateurs permet d'écrire du code asynchrone dans un très simple et joue bien avec le reste de la langue, ce qui signifie que vous pouvez utiliser Javascript si les déclarations, les boucles, etc au lieu de devoir les reproduire avec des fonctions. Cela signifie également qu'il est très facile de convertir précédemment synchronisation du code dans une version asynchrone. Cependant, il y a l'inconvénient que chaque navigateur va exécuter Javascript de votre extension de sorte que vous aurez besoin d'ajouter une étape de compilation dans votre construction proccess de convertir votre code régulier de la JS avec des rappels dans la continuation passing style. De toute façon, une alternative prometteuse est l'générateurs Ecmascript 6 spec - alors que seulement firefox prend en charge nativement comme de maintenant, il y a des projets comme régénérateur et Traceur pour les compiler en arrière pour les rappels. Il y a aussi d'autres projets qui créent leurs propres async syntaxe (depuis es6 générateurs n'était pas venu jusqu'à revenir à l'époque). Dans cette catégorie, vous trouverez des choses comme tamejs et Glacé Coffeescript. Enfin, si vous utilisez Node.js de là, vous pouvez également jeter un oeil à Les fibres.
Ma recommandation:
Si vous voulez juste quelque chose de simple que de ne pas compliquer votre build proccess, je conseille d'aller avec ce flux de contrôle de la bibliothèque correspond le mieux à votre style personnel et les bibliothèques que vous utilisez déjà.
Cependant, si vous vous attendez à écrire beaucoup de complexes et profondément intégrés code asynchrone, je vous recommande fortement à moins regarder dans un compilateur de remplacement.
Q
bibliothèque pimvdb également mentionné dans le commentaire à ma question a l'air parfaite. Pourriez-vous donner de la rétroaction sur les bibliothèques avant de me décider à descendre un chemin? Ce que je suppose que je ne veux pas est bien un appel bloquant complètement le premier invoquer.En fait, je travaille principalement avec Dojo toolkit de choses donc je n'ai plus de mon expérience avec leur promesse de la bibliothèque et pas beaucoup d'expérience avec les solutions de rechange. Tous les différents styles doit être en mesure de faire tous les non-blocage de choses que vous devez donc vous devriez regarder de plus pour le style de programmation de toute façon. Si je dois commencer quelque chose de bien maintenant, je voudrais fortement envisager l'utilisation d'un CPS compilateur - je ne sais pas vraiment comment il allait tourner mais pour l'instant je suis un peu fatigué d'avoir à écrire manuellement CPS code et d'espérer quelque chose de mieux.
Grâce missingno, je suis en utilisant le Appcelerator Titanium Mobile SDK donc ne veulent pas vraiment à mettre un autre outil dans la chaîne d'outils. Expérimenter avec le Q de la bibliothèque ne semble vraiment comme un choix naturel.
Vous devriez demander que d'une question distincte au lieu de les cacher dans ces vieux commentaires.
C'est un Q&Un site. Comment poser une question "boiteux"? (Et mes exemples étaient plus des fins d'illustration. Je ne sais pas si tous travaillent avec du titane ou tout autre environnement que vous souhaitez utiliser)
OriginalL'auteur hugomg