输出空数组-(异步)

时间:2019-01-18 08:55:19

标签: javascript amazon-web-services

我正在使用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 :(得分:0)

您可以将代码分成多个函数,以更好地了解正在发生的事情。您面临的问题是您要访问值,该值是从主函数(全局范围)中的异步调用返回的,由于异步调用的工作方式,这是不可能的。

首先,让我们编写一个仅将一个区域作为输入并返回一个承诺的函数,该函数保存从基础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数组,并利用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