Parallel processing 使用.then内部异步并行

Parallel processing 使用.then内部异步并行,parallel-processing,sequelize.js,async.js,Parallel Processing,Sequelize.js,Async.js,我试图在async.parallel中运行两个sequelize查询,这样我就可以在回调中将它们传递给表单(尽管这里没有显示表单集成)。当我运行它时,它返回results.animals,但是results.zones是未定义的 我可以从日志中看到,在async.parallel回调函数运行之后,它正在运行Zone.findAll。如果我只在区域中执行一个sequelize调用,那么它就可以工作,但在查询state.findOne和Zone.findAll时就不行了 知道为什么会这样吗?我以为a

我试图在async.parallel中运行两个sequelize查询,这样我就可以在回调中将它们传递给表单(尽管这里没有显示表单集成)。当我运行它时,它返回results.animals,但是results.zones是未定义的

我可以从日志中看到,在async.parallel回调函数运行之后,它正在运行Zone.findAll。如果我只在区域中执行一个sequelize调用,那么它就可以工作,但在查询state.findOne和Zone.findAll时就不行了

知道为什么会这样吗?我以为async.parallel应该等到两者都完成后再返回

async.parallel({
        animals: function(callback) { 
                    Animal.findAll().then(function(animalResult){
                        console.log("animals result: " + JSON.stringify(animalResult))
                        callback(null, animalResult);
                    })
                }, 
        zones: function(callback){
                    State.findOne({
                        where : { abbr : req.query.state.toUpperCase() }
                    }).then(function(state) {
                        console.log("State ID: " + JSON.stringify(state['id']))
                        Zone.findAll({
                            attributes: ['name'],
                            where: { StateId : state['id']}
                        })
                    }).then(function(zoneResult) {
                        console.log("zones result: " + JSON.stringify(zoneResult));
                        callback(null, zoneResult);
                    });
                }
        }, function(err, results) {
            if (err) { return next(err); }
            console.log("Results in callback: " + JSON.stringify(results));
            res.send(results)
        }
    );

如果您的目标是在表单中同时提供两个(或可能更多)查询的结果,则可以按以下方式使用Promise.join:

var Sequelize = require('sequelize');
var sequelize = new Sequelize(dbName, username, ...);

var getAnimals = function(){
  return Animal.findAll({ where: { name: 'xyz' }});
}

var getZones = function(){
  return State.findOne({ where: { abbr : req.query.state.toUpperCase() }})
        .then(function(state){ 
            return Zone.findAll({ where: { StateId : state['id']} }});
        });
}

// now use Promise.join to execute the 2 functions concurrently and
// have their result in the handler function
sequelize.Promise.join(getAnimals(), getZones(), function(animals, zones){
  // animals and zones are sequelize instances
  console.log(animals.someProperty);
  console.log(zones.someProperty);
  res.json({ animals: animals, zones: zones });
});
看看这个: