Разный вывод при каждой компиляции - PullRequest
0 голосов
/ 24 декабря 2018

Когда я компилирую, вывод моего параметра "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
      }
   });
}

Иногда у меня есть:

  • Дерньер: 200,400,1000
  • Дерньер: 400,200,1000
  • Дерньер: 1000,400,200

Но результат, который я хочу получить:

  • Derniere: 200,1000,400

... и это для каждой компиляции.

1 Ответ

0 голосов
/ 24 декабря 2018

Причина непредсказуемого порядка в том, что getMetricStatistics выполняет HTTP-запрос, который является асинхронным.Некоторые из этих вызовов могут возвращать ответ быстрее, чем другие, что может привести к другому порядку, нежели порядок, в котором вы звоните getMetricStatistics.

Вот как вы можете решить его.Сначала убедитесь, что объявляет key вместо того, чтобы сделать его неявным глобальным (что является плохой практикой).В этом случае должно быть переменной области видимости блока, поэтому используйте const или let, а не var:

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

Затем в обратном вызове getMetricStatistics donНе используйте push, но используйте key для хранения ответа:

derniere[key] = parseInt(tableau);

Теперь ответы по-прежнему поступают в непредсказуемом порядке, но вы сохраняете их в предсказуемом месте.В конце массив derniere будет завершен.

...