我正在使用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}]]
答案 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
。