Problém je v tom, že v findOne
zpětné volání – vaše beerId
bude vždy nastaveno na poslední pivo v beerObjects
, protože smyčka skončí dříve, než se dostanete k prvnímu zpětnému volání – vítejte v asynchronním javascriptu.
Jedním z řešení je zabalit váš findOne
kód v IFFE (Immediately Invoked Function Expression). Tento kód bude dokončen před přechodem na další pivo z beerObject.
Zde je několik dalších informací o IFFE
Rychle jsem si prošel kód, věřím, že by to mělo fungovat, ale možná budete muset provést nějaké úpravy v interním kódu...
for(var i = 0; i < beerObjects.length; i++) {
console.log(beerObjects[i].beerId);
//var currentBeer = beerObjects[i]; dont need this now
(function (currentBeer) {
Beer.findOne({ beerId: currentBeer},
function(err, beer) {
if(!err && !beer) {
var newBeer = new Beer();
newBeer.beerId = currentBeer.beerId;
newBeer.name = currentBeer.name;
newBeer.description = currentBeer.description;
newBeer.abv = currentBeer.abv;
newBeer.image = currentBeer.image;
newBeer.save(function(err) {
// log your error here...
});
} else if(!err) {
console.log("Beer is in the system");
} else {
console.log("ERROR: " + err);
}
}
);
})(beerObjects[i].beerId);
}