在异步并行内使用.then

时间:2017-04-07 01:15:38

标签: parallel-processing sequelize.js async.js

我正在尝试在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)
        }
    );

1 个答案:

答案 0 :(得分:0)

如果您的目标是同时在表单中提供两个(或可能更多)查询的结果,您可以按以下方式使用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 });
});