每次编译时输出不同

时间:2018-12-24 11:49:09

标签: javascript amazon-cloudwatch

当我编译时,我的参数“ derniere”的输出是不同的。

我觉得他随机运行我的JSON

我正在使用JSON作为

的循环
var AWS = require('aws-sdk');
var arr = [{
    "region": "eu-west-1",
    "Value": "https://***",
    "cle": "1"
}, {
    "region": "eu-west-1",
    "Value": "https://***",
    "cle": "2"
}, {
    "region": "eu-west-1",
    "Value": "https://***",
    "cle": "3"
},]
//************* END JSON ********************

for(key in arr){
    console.log(arr[key]);
    var region = arr[key].region;
    var Value_t = arr[key].Value;


    // ********** CONFIGURATION**************
    AWS.config.region = region;
    var cw = new AWS.CloudWatch({apiVersion: '2010-08-01'});
    var startDate = new Date();
    var endDate = new Date();
    startDate.setHours(startDate.getHours()-1);

    var params2 = {   
        StartTime: startDate,
        EndTime: endDate,
        Namespace: 'Lambda-Ping/HTTP', /* required */
        Period: 300, /* required */
        MetricName: 'Latency', /* required */
        Dimensions: [{   
            Name: 'Endpoint', /* required */
            Value: Value_t
        },
        /* more items */
        ],
        Statistics: [
            'Average'
            /* more items */
        ],
    };
// ************ END CONFIGURATION ************
    cw.getMetricStatistics(params2, function(err, data) {
      if (err){
        console.log(err, err.stack); // an error occurred
      }
      else{    
        for (var i=0;i<5;i++){
          var tableau = data.Datapoints[i].Average;
        }
        derniere.push(parseInt(tableau));
        console.log("Derniere: "+derniere+"\n");
        // OUTPUT different Derniere: 400, 1000, 200
        // OUTPUT different Derniere: 1000, 200, 400
        // OUTPUT need Derniere: 200, 1000, 400
      }
   });
}

有时候我有:

  • Derniere:200,400,1000
  • Derniere:400,200,1000
  • Derniere:1000,400,200

但是我想要的结果是:

  • Derniere:200,1000,400

...还有这个,用于每次编译。

1 个答案:

答案 0 :(得分:0)

顺序不可预测的原因是getMetricStatistics执行HTTP请求,该请求是异步的。这些呼叫中的某些呼叫返回的响应可能比其他呼叫更快,可能导致与呼叫getMetricStatistics的次序不同。

这是解决问题的方法。首先,请确保声明 key,而不是使其成为隐式全局变量(这是不好的做法)。在这种情况下,它应该是一个块范围变量,因此请使用constlet,而不要使用var

for (const key in arr){
//   ^^^^^

然后在getMetricStatistics的回调中不要使用push,而要使用key来存储响应:

derniere[key] = parseInt(tableau);

现在,响应仍然处于不可预测的顺序,但是您将它们存储在可预测的位置。最后,数组derniere将完成。