8
votes

Mongoose JS promet? Ou comment gérer la sauvegarde de lots

Comment gérer le lot enregistrera-t-il dans la mangouste? Je l'ai vu ne peut pas encore être possible:


0 commentaires

8 Réponses :


2
votes

Pour enregistrer plusieurs documents de Mongoose en parallèle, vous pouvez faire quelque chose de simple comme celui-ci (en supposant que vous avez un tableau nommé docs code> de documents à enregistrer):

var count = docs.length;
docs.forEach(function(doc) {
    doc.save(function(err, result) {
        if (--count === 0) {
            // All done; call containing function's callback
            return callback();
        }
    });
});


0 commentaires

3
votes

Essayez le parallèle fonction du async module. XXX


0 commentaires

1
votes

Un exemple raffiné sur la manière d'utiliser async parallèle serait: xxx

puisque la convention est la même dans la mangouse que dans ASYNC (ERR, Rappel), vous n'avez pas besoin de les envelopper dans vos propres rappels, ajoutez simplement vos appels d'enregistrement dans un tableau et vous obtiendrez un rappel. quand tout est fini.


2 commentaires

Ou à lot-sauvegarder un tableau: async.map (objets, fonction (objet, suivant) {objet.save (suivant)}, rappel);


Merci. Je pense que l'approche de la carte est meilleure. Mais les deux vont bien.



9
votes

Oui, vous pouvez le faire avec des promesses. Si vous utilisiez le Q Bibliothèque de promesses, vous pouvez ré-écrire le code de Matz3 comme: xxx < P> Nous commençons toutes les opérations une à la fois de la boucle, mais nous n'attendons que d'entre eux de se terminer. Ils fonctionnent donc en parallèle. Nous ajoutons une promesse (qui agit comme un espace réservé pour le résultat) à un tableau. Nous attendons ensuite toutes les promesses de la gamme de promesses de compléter.

la plus bonne promesses / A + Les bibliothèques compatibles ont équivalent à q.all


7 commentaires

Nouveau à cela afin que cela pourrait être faux. Mais votre sauvegarde () là-bas lorsque vous construisez la matrice, ne devriez-vous pas exclure le () de sorte qu'il n'évalue pas tout en construisant le tableau?


Non, je démarre les opérations dans la matrice, j'ai donc besoin d'inclure le () . Cela renvoie ensuite un objet que j'ai mis dans la matrice. C'est parallèle parce que je n'ai qu'une promesse, pas le résultat final réel. À la fin, j'attends ensuite ces promesses de résoudre.


Si je devais omettre le () J'obtiendrais une gamme de fonctions, et il n'y a pas de chose universellement reconnue à faire avec une gamme de fonctions. Par exemple, je souhaiterais peut-être qu'ils s'exécutent une à la fois plutôt qu'en parallèle, ou ils pourraient faire un rappel plutôt que de retourner une promesse. Il y a cependant une façon reconnue d'attendre un éventail de promesses à remplir.


Je ne pense pas que Save () retourne une promesse cependant.


Si ce n'est pas le cas, c'est probablement un bug avec mangouste. Il retourne correctement les promesses des requêtes exécutées. S'il n'utilise pas de promesses par défaut, vous pouvez remplacer docs [i] .save () avec q.denodose (docs [i] .save.bind (Docs [i])) () pour obtenir une promesse d'une fonction basée sur le rappel.


.Save ne retourne pas une promesse. Pourquoi?


On dirait que modèle # Enregistrer retournera une promesse de 3.10 . Total de bonnes nouvelles.



-1
votes

Quoi de async.queue .
Un exemple simple: xxx pré>

Si vous avez besoin d'un rappel après la vidange de la file d'attente: P>

var emptyQueue = true;
var queue = async.queue(function(obj, callback) {
  return obj.save(callback);
});
queue.drain = function() {
  // Every callbacks are finished
  // bigCallback();
};

for (var i in objs) {
  var obj = objs[i];
  // Some changes on object obj
  queue.push(obj);
  emptyQueue = false;
}
if (emptyQueue) {
  // Call manually queue drain in case of the queue is empty
  //  and we need to call bigCallback() for example
  return queue.drain();
}


0 commentaires

-1
votes

@forbeslindesay Pourquoi charger une bibliothèque externe lorsque vous pouvez utiliser la mise en œuvre de la MONGOOSE de promesses et créer votre propre tout?

Créer un module qui améliore la promesse de mangouste avec tous. P>

require('./promise')

...

var tasks = [];

for (var i=0; i < docs.length; i++) {
  tasks.push(docs[i].save());
}

mongoose.Promise.all(tasks)
  .then(function(results) {
    console.log(results);
  }, function (err) {
    console.log(err);
  });


1 commentaires

Eh bien, il semble plus simple d'utiliser Mypomise qui est utilisé à l'intérieur de la mangouste: var promett = nécessite ('MPROMISE'); Utilisez ensuite promess.Tous (...) .



6
votes

MONGOOSE vous permet maintenant de choisir la mise en œuvre de la promesse.

Ici, j'utilise la promesse du système par défaut de nœud.js (ES6) cuit dans NDEJS xxx

nœud - -version v4.1.1

mongoose@4.1.8


0 commentaires

5
votes

Etant donné que Mongoose code> prend maintenant en charge les promesses que vous pouvez utiliser promettez.All (). Alors () code>, il retournera donc lorsque toutes les promesses sont résolues.

Promise.all(
  [ obj1, obj2, obj3 ]
  .map( obj => obj.save() )
)
.then( ([ savedObj1, savedObj2, savedObj3 ]) => {
   // do something with your saved objects...
})


0 commentaires