Выходной пустой массив - (асинхронный) - PullRequest
0 голосов
/ 18 января 2019

Я использую 3 региона и использую конфигурацию aws для вывода меток времени и среднего.

Но я не понимаю, почему у меня в выводе пустой массив.

Я добавляю другую конфигурацию, совместно использую объект cw и детали метода getMetricStatistics.

Я не понимаю метод ответного асинхронного вызова

Спасибо за помощь

var arr = [
    { "region": "eu-west", "value": "http://****" },
    { "region": "eu-west", "value": "http://****" },
    { "region": "eu-west", "value": "http://****" },
    ] ;  

var GlobalTab = [];

var r=-1;
    while ( arr[++r] ) {
    var region= arr[r].region; //test
    var Value = arr[r].value ; //test
    cw.getMetricStatistics(params, function(err, data) {
        if (err){
            console.log(err, err.stack); // an error occurred
        }
        else {   
            var TabJSON = [];
            for(var i=0;i<5;i++) {
                TabJSON.push(data.Datapoints[i]);
            }
        GlobalTab.push(TabJSON);
        function foo(){
        return new Promise( (resolve, reject) => { 
        setTimeout ( function(){    
        resolve(GlobalTab)// 
        }, 1000 )
        })
        }
        }
    });
}
console.log(GlobalTab); //error empty array
let bar ; 
foo().then( res => {
bar = res;
console.log(bar) // 
});

Ожидаемый результат:

[[{Timestamp: 2019-01-15T08:26:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:32:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:26:00.000, Average: 200},
{Timestamp: 2019-01-15T08:29:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:35:00.000Z, Average: 200}],
[{Timestamp: 2019-01-15T08:26:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:32:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:26:00.000, Average: 200},
{Timestamp: 2019-01-15T08:29:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:35:00.000Z, Average: 200}],
[{Timestamp: 2019-01-15T08:26:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:32:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:26:00.000, Average: 200},
{Timestamp: 2019-01-15T08:29:00.000Z, Average: 200},
{Timestamp: 2019-01-15T08:35:00.000Z, Average: 200}]]

1 Ответ

0 голосов
/ 18 января 2019

Вы можете разбить свой код на несколько функций, чтобы лучше видеть, что происходит. Проблема, с которой вы сталкиваетесь, заключается в том, что вы хотите получить доступ к значению, которое было возвращено из асинхронного вызова в основной функции (глобальная область), что невозможно из-за того, как работают асинхронные вызовы.

Во-первых, давайте напишем функцию, которая принимает в качестве входных данных только один регион и возвращает обещание, содержащее статистику для этого региона, возвращенную из базового вызова cw.getMetricStatistics.

function getRegionMetrics(regionParams) {
    return new Promise((resolve, reject) => {
        cw.getMetricStatistics(regionParams, function(err, data) {
            if (err) {
                console.log(err, err.stack);
                reject(err);
            } else {
                var TabJSON = [];
                for (var i = 0; i < 5; i++) {
                    TabJSON.push(data.Datapoints[i]);
                }
                resolve(TabJSON);
            }
        });
    });
}

Далее вам нужна функция, которая будет вызывать вышеуказанную функцию для каждой области, которую вы хотите обработать. Здесь вы можете использовать функцию map для создания массива обещаний и Promise.all для разрешения этого массива.

function getAllMetrics(regions) {
    return Promise.all(
        regions.map(regionParams => getRegionMetrics(regionParams))
    );
}

Ваша логика обработки завершена. Теперь, когда вам нужно получить статистику для массива регионов, просто вызовите функцию getAllMetrics и объедините ее в цепочку с помощью метода then.

getAllMetrics(regions).then(res => {
    console.log(res); // here "res" is your "globalTab"
}).catch(err => {
    console.log(err);
});

Где regions - ваш arr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...