Existe-t-il une approche purement Promise pour la cartographie / la concaténation des collections?

async vs Q généralement

Je suis en apprentissage Node.js de développement, et d'essayer d'envelopper mon cerveau autour de stratégies pour la gestion asynchrone "rappel de l'enfer". Les deux principales stratégies que j'ai explorés sont Caolan McMahon est asynchrone module, et Kris Kowal la promesse de base de Q module.

Comme de nombreuses autres personnesj'ai encore des difficultés à comprendre lorsque vous utilisez l'un contre l'autre. Toutefois, de façon générale, j'ai trouvé des promesses et de la Q-fonction code à légèrement plus intuitive, de sorte que j'ai été en mouvement dans cette direction.

Cartographie/Concaténation des collections généralement

Cependant, je suis toujours bloqué à l'aide de la async du module fonctions pour la gestion des collections. Venant de Java et Python arrière-plan, la plupart du temps quand je travaille avec une collection, la logique ressemble à ceci:

  1. Initialiser un nouveau regroupement vide, dans lequel stocker les résultats.
  2. Effectuer une boucle for-each avec l'ancienne collection, l'application de la logique de chaque élément et en le poussant à son résultat dans le vide nouvelle collection.
  3. Lorsque la boucle for-each se termine, continuer à utiliser la nouvelle collection.

En JavaScript côté client, j'ai pris l'habitude d'utiliser du jQuery map() de la fonction... en passant de l'étape 2 de la logique, et l'obtention de l'étape #3 résultat comme valeur de retour. Se sent comme à la même approche de base.

Cartographie/Concaténation des collections avec async et Q

Le Nœud du côté asynchrone module est similaire carte et concat fonctions, mais ils ne retournent pas le résultat concaténé de retour à la portée initiale de niveau. Vous devez, au lieu de descendre dans la fonction de rappel de l'enfer à utiliser le résultat. Exemple:

var deferred = Q.defer();

...

var entries = [???]; //some array of objects with "id" attributes

async.concat(entries, function (entry, callback) {
    callback(null, entry.id);
}, function (err, ids) {
    //We now have the "ids" array, holding the "id" attributes of all items in the "entries" array.
    ...
    //Optionaly, perhaps do some sorting or other post-processing on "ids".
    ...
    deferred.resolve(ids);
});

...

return deferred.promise;

Depuis que mes autres fonctions sont de plus en promesse de base, j'ai ce code de retour d'une promesse de l'objet de sorte qu'il peut être facilement inclus dans un then() de la chaîne.

Ai-je vraiment besoin des deux?

L'ultime question que j'ai du mal à articuler: ai-je vraiment besoin des deux async et Q dans l'exemple de code ci-dessus? Je suis en train d'apprendre comment remplacer la async du module de contrôle de flux avec Q-style promesse chaînes en général... mais il n'a pas encore "cliqué" pour moi, la façon de faire de la cartographie ou de la concaténation des collections avec une promesse. Sinon, j'aimerais comprendre pourquoi vous ne pouvez pas, ou pourquoi il n'est pas une bonne idée.

Si async et Q sont destinés à travailler ensemble en tant que je suis avec eux dans l'exemple ci-dessus, alors ainsi soit-il. Mais je préfère ne pas exiger la bibliothèque de dépendance si je pouvais proprement utilisation Q seul.

(Désolé si je suis absent quelque chose outrageusement évident. L'événement asynchrone modèle est un monde très différent, et ma tête est encore la natation.)

source d'informationauteur Steve Perkins