JSFiddle - React, Tailwind, and code Playground

by divyanshu013

JavaScript

const getApplicationProtectionStats = (datacenterUrl, applicationType)=> new Promise((resolve) => {
	setTimeout(() => {
		resolve({
			protectedApps: Math.floor(Math.random() * 100),
			unprotectedApps: Math.floor(Math.random() * 100)
		});
	}, 1000);
});

// getApplicationProtectionStats('https://www.olive.com/stat', 'vmware').then(console.log)

const applicationTypes = [
	'vmware',
	'mssql',
	'ahv'
];

const datacenters = [
	{name: 'olive', url: 'https://www.olive.com/stat'},
	{name: 'comet', url: 'https://www.comet.com/stat'},
	{name: 'blah', url: 'https://www.blah.com/stat'}
];

function getDataForDatacenter(datacenter, applicationTypes) {
	let result = applicationTypes.map((item)=>{
		return getApplicationProtectionStats(datacenter.url, item);
	});
	
	return	Promise.all(result).then((res)=>{
			let protectedSum = 0, unprotectedSum = 0;
			res.map((item)=>{
				protectedSum += item.protectedApps;
				unprotectedSum += item.unprotectedApps;
			});
		
		return {'protectedApps': protectedSum, 'unprotectedApps': unprotectedSum};
	})
}

const allValuesPromise = datacenters.map(center => getDataForDatacenter(center, applicationTypes));

Promise.all(allValuesPromise).then(data => {
	const result = data.reduce((resultObject, currentData, index) => ({
  	...resultObject,
  	[datacenters[index].name]: currentData
  }), {});
  console.log('✅✅✅✅✅')
  console.log(result) // FINAL ANSWER
})

/* getDataForDatacenter(datacenters[0], applicationTypes).then(console.log); */

// Expected output

// {
//   olive: {
//     protectedApps: <sum of protected apps counts for each application type in olive>,
//     unprotectedApps: <sum of unprotected apps counts for each application type in olive>
//   },
//   comet: {...},
//   blah: {...}
// }