2017-04-07 42 views
0

我想在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

如果你的目標是讓兩者的結果(或可能更多)在您的形式提供查詢的同時,您可以通過以下方式使用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 }); 
});