2015-12-01 4 views
0

Я пишу сценарий hubot для перечисления всех моих стеков CloudFormation в AWS по регионам. Я написал следующее, и он работает, за исключением порядка вывода данных. Сценарий:неожиданный порядок выполнения обратного вызова

key = process.env.HUBOT_AWS_ACCESS_KEY_ID 
secret = process.env.HUBOT_AWS_SECRET_ACCESS_KEY 
defaultRegions = 'us-east-1,us-west-2,eu-west-1' 

_ = require 'underscore' 
moment = require 'moment' 
AWS = require 'aws-sdk' 

getRegionStacks = (region, logger, msg) -> 
    msg.send "In region #{region}:" 
    AWS.config.region = region 
    cloudFormation = new AWS.CloudFormation() 
    params = { 
     StackStatusFilter: [ 'CREATE_COMPLETE' ] 
    } 
    cloudFormation.listStacks params, (err, data) -> 
     if err 
      logger.error "Received error #{JSON.stringify err}" 
      logger.error err.stack 
     else 
      for stack in data.StackSummaries 
        msg.send stack.StackName 

module.exports = (robot) -> 
    robot.hear /List running Cloudformation stacks/i, (msg)-> 
     msg.send "The following CloudFormation stacks are running:" 
     getRegionStacks region, robot.logger, msg for region in defaultRegions.split ',' 

Я ожидаю выход выглядеть следующим образом:

The following CloudFormation stacks are running: 
    In region us-east-1: 
    demo-container1 
    In region us-west-2: 
    demo-container2 
    In region eu-west-1: 
    demo-container3 

Однако, похоже, что обратные вызовы все стрельбы после того, как функции завершена, и выход возвращается в следующем:

The following CloudFormation stacks are running: 
    In region us-east-1: 
    In region us-west-2: 
    In region eu-west-1: 
    demo-container1 
    demo-container2 
    demo-container3 

Я уверен, что я пропускаю что-то простое. Кто-нибудь имеет представление о том, что я делаю неправильно?

ответ

0

Похоже, что вы печатаете область синхронно, а функция liststacks является асинхронной. Следующие непроверены, но могут работать:

getRegionStacks = (region, logger, msg) -> 
    AWS.config.region = region 
    cloudFormation = new AWS.CloudFormation() 
    params = { 
     StackStatusFilter: [ 'CREATE_COMPLETE' ] 
    } 
    cloudFormation.listStacks params, (err, data) -> 
     if err 
      logger.error "Received error #{JSON.stringify err}" 
      logger.error err.stack 
     else 
      msg.send "In region #{region}:" 
      for stack in data.StackSummaries 
       msg.send stack.StackName 
Смежные вопросы