2017-10-05 7 views
0

私の下のコードは、私の写真find()約束が完了する前に、非同期の次のコールバックを起動しています。 async.forEachは、nextが呼び出されるまで発生しませんでした。async forEach次のメソッドは待機しません

私は自分の写真[0]がカテゴリ:item.strIdが渡されるのと同じ順番で出てくるようにしようとしています。今はそのように動作せず、ランダムな注文を返しています。 forEachの次のループが起こる前に、約束を待つ方法がありますか?私はそれが非同期のコールバックのためだと思った。または私はそれを誤解しています。

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); 
    }); 
    }) 

} 

私は私のmongoose.promiseとしてglobal.Promiseを使用しています:

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

答えて

0

async.jsとの約束を混在させないでください。一緒にうまく働かない。

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); 
    }); 
}; 
関連する問題