2017-10-05 5 views
0

내 사진 find()이 완료되기 전에 아래 코드가 비동기 콜백을 실행 중입니다. 이 호출 될 때까지 async.forEach이 (가) 실행되지 않았다고 생각했습니다.비동기 forEach 다음 메소드가 대기하지 않습니다.

내 사진 [0]이 카테고리와 같은 순서로 나옵니다. item.strId가 전달되었습니다. 지금 당장 그 방식으로 작동하지 않으며 임의의 주문을 반환합니다. forEach의 다음 루프가 일어나기 전에 약속을 기다릴 수있는 방법이 있을까요? 비동기의 콜백이 무엇인지 생각했습니다. 또는 나는 그것을 오해하고있다. 내 mongoose.promise으로 내가 global.Promise을 사용하고

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

} 

:

답변

0

가 async.js와 약속을 혼합하지 마십시오

const mongoose = require('mongoose'); 
mongoose.Promise = global.Promise; 
. 그들은 함께 잘 작동하지 않습니다.

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