Je construis une application en utilisant meteor.js et MongoDB et j'ai une question à propos de cursor.forEach (). Je souhaite vérifier certaines conditions au début de chaque itération forEach, puis ignorer l'élément si je n'ai pas à effectuer l'opération pour pouvoir gagner du temps.
Voici mon code:
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
if (element.shouldBeProcessed == false){
// Here I would like to continue to the next element if this one
// doesn't have to be processed
}else{
// This part should be avoided if not neccessary
doSomeLengthyOperation();
}
});
Je sais que je pourrais transformer le curseur en tableau à l'aide de cursor.find (). Fetch (), puis utiliser une boucle for régulière pour parcourir les éléments et utiliser continue et break normalement, mais cela m'intéresse s'il existe quelque chose de similaire à utiliser dans forEach ( ).
Chaque itération de la forEach()
appellera la fonction que vous avez fournie. Pour arrêter le traitement ultérieur dans une itération donnée (et continuer avec l'item suivant), il vous suffit de return
à partir de la fonction au point approprié:
elementsCollection.forEach(function(element){
if (!element.shouldBeProcessed)
return; // stop processing this iteration
// This part will be avoided if not neccessary
doSomeLengthyOperation();
});
À mon avis, la meilleure approche pour y parvenir consiste à utiliser la méthode filter
méthode car il est inutile de revenir dans un bloc forEach
; pour un exemple sur votre extrait:
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection
.filter(function(element) {
return element.shouldBeProcessed;
})
.forEach(function(element){
doSomeLengthyOperation();
});
Cela va restreindre votre elementsCollection
et ne conserver que les éléments filtred
à traiter.
Utilisation de JavaScripts court-circuit évaluation. Si el.shouldBeProcessed
renvoie true, doSomeLengthyOperation
elementsCollection.forEach( el =>
el.shouldBeProcessed && doSomeLengthyOperation()
);
Voici une solution utilisant for of
et continue
au lieu de forEach
:
_
let elementsCollection = SomeElements.find();
for (let el of elementsCollection) {
// continue will exit out of the current
// iteration and continue on to the next
if (!el.shouldBeProcessed){
continue;
}
doSomeLengthyOperation();
});
_