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