2017-10-05 2 views
0

Mein Code unten feuert den async nächsten Rückruf, bevor mein Foto find()Versprechen getan wird. Ich dachte, async.forEach wurde nicht ausgelöst, bis next aufgerufen wurde.async forJede nächste Methode wartet nicht

Ich versuche, mein Foto [0] in der gleichen Reihenfolge wie die Kategorie zu bekommen: item.strId wird übergeben. Im Moment funktioniert es nicht so und gibt zufällige Befehle zurück. Gibt es eine Möglichkeit, auf das Versprechen zu warten, bevor die nächste Schleife für forEach passiert. Ich dachte, das wäre der Callback von async. Oder ich missverstehe es.

exports.fetchHomeCollection = (req, res, next)=>{ 
    const collection = []; 

    Category.find({count : { $gt : 0}}).then(categories =>{ 
    async.forEach(categories, function(item, next){ 
     console.log("item.strId = ", item.strId); 
     Photo.find({isDefault:true, category:item.strId}).then((photo)=>{ 
      console.log("photo = ", photo); 
      collection.push(photo[0]); 
      next(); 
     }); 
    }, 
    function(err){ 
     if(err) console.log("fetchHomeCollection async forEach error"); 
     res.send(collection); 
    }); 
    }) 

} 

ich global.Promise wie mein mongoose.promise bin mit:

const mongoose = require('mongoose'); 
mongoose.Promise = global.Promise; 

Antwort

0

nicht Promises mit async.js mischen. Sie funktionieren nicht gut zusammen.

exports.fetchHomeCollection = (req, res, next)=>{ 
    async.waterfall([ 
     function (cb) { 
      Category.find({ count: { $gt : 0 }}, cb); 
     }, 
     function (categories, cb) { 
      async.map(categories, function (category, next) { 
       Photo.findOne({ isDefault:true, category: category.strId }, next); 
      }, cb); 
     } 
    ], 
    function (err, photos) { 
     if (err) 
      console.log("fetchHomeCollection async forEach error"); 
     res.send(photos); 
    }); 
}; 
Verwandte Themen