Il existe une tonne de bibliothèques qui aident à corriger le syndrome des couches de rappel.
En fait, il y en a trop, lequel dois-je utiliser ?
Il existe une tonne de bibliothèques qui aident à corriger le syndrome des couches de rappel.
En fait, il y en a trop, lequel dois-je utiliser ?
J'utilise Async.js .
Async est un module utilitaire qui fournit des fonctions simples et puissantes pour travailler avec JavaScript asynchrone. Bien que conçu à l'origine pour être utilisé avec node.js, il peut également être utilisé directement dans le navigateur.
Exemples
async.map(['file1','file2','file3'], fs.stat, function(err, results){
// results is now an array of stats for each file
});
async.filter(['file1','file2','file3'], path.exists, function(results){
// results now equals an array of the existing files
});
async.parallel([
function(){ ... },
function(){ ... }
], callback);
async.series([
function(){ ... },
function(){ ... }
]);
Choisissez-en un que vous aimez :P. J'aime asynchrone par exemple. Mais Étape est également assez célèbre. Je pense que c'est une très bonne chose qu'il y ait autant de modules. La communauté node.js publie de très bons modules. Les installer avec NPM ne vous demandera aucun effort.
J'aime utiliser les promesses de Q :
Si une fonction ne peut pas renvoyer une valeur ou lever une exception sans blocage, elle peut renvoyer une promesse à la place. Une promesse est un objet qui représente la valeur de retour ou l'exception levée que la fonction peut éventuellement fournir. Une promesse peut également être utilisée comme un proxy pour un objet distant afin de surmonter la latence.
Au premier passage, les promesses peuvent atténuer la "pyramide du malheur" : la situation où le code se déplace vers la droite plus vite qu'il ne progresse.
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
Avec une bibliothèque de promesses, vous pouvez aplatir la pyramide.
Q.fcall(step1)
.then(step2)
.then(step3)
.then(step4)
.then(function (value4) {
// Do something with value4
}, function (error) {
// Handle any error from step1 through step4
})
.done();
Avec cette approche, vous obtenez également une propagation implicite des erreurs, tout comme try, catch et finally. Une erreur survenue à l'étape 1 sera transmise à l'étape 5, où elle sera détectée et traitée.
L'approche du rappel est appelée "inversion de contrôle". Une fonction qui accepte un callback au lieu d'une valeur de retour dit : "Ne m'appelle pas, je t'appelle". Les promesses inversent l'inversion, en séparant proprement les arguments d'entrée des arguments de flux de contrôle. Cela simplifie l'utilisation et la création d'API, en particulier les arguments variadiques, de repos et de propagation.
Le problème que j'ai rencontré avec d'autres bibliothèques de synchronisation, c'est qu'elles m'obligeaient souvent à définir toutes mes tâches au départ et qu'elles n'offraient pas une API propre et intuitive. Je voulais simplement pousser des tâches vers un groupe, n'importe quand et n'importe où, et ensuite exécuter ce groupe en parallèle ou en série.
J'aime la fonctionnalité du flux à l'intérieur Groupe de travail et l'a utilisé pour de nombreux projets importants, dont DocPad et BugHerd . Les exemples sont dans le README.
Je trouve async.js utile et je pense que c'est un excellent article : http://www.sebastianseilund.com/nodejs-async-in-practice
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.