async forEach下一个不等待的方法

时间:2017-10-05 04:34:03

标签: javascript node.js mongoose async.js

我的下面的代码在我的照片find() 承诺完成之前触发了异步下一个回调。 在async.forEach被调用之前,我认为next没有开火。

我正在尝试让我的照片[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);
    });
  })

}

我正在使用global.Promise作为我的mongoose.promise

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

1 个答案:

答案 0 :(得分:0)

不要将Promise与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);
    });
};