每次编译都有不同的输出

Different output at each compilation

当我编译时,我的参数 "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
      }
   });
}

有时我有:

但我想要的结果是:

...还有这个,对于每个编译。

顺序不可预测的原因是getMetricStatistics执行了一个异步的HTTP请求。其中一些调用可能 return 响应比其他调用更快,可能导致与您调用 getMetricStatistics.

的顺序不同的顺序

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

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

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

derniere[key] = parseInt(tableau);

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