Promises: Settled Request Pattern
promises
by nickadeemus2002
JavaScript
var fetch = require('node-fetch');
var endpoints = [
{ name: "people", url: "http://swapi.co/api/people/"},
{ name: "planets", url: "http://swapi.co/api/planets/"},
{ name: "films", url: "http://swapi.co/api/films/"},
{ name: "species", url: "http://swapi.co/api/species/"},
{ name: "vehicles", url: "http://swapi.co/api/vehicles/"},
{ name: "starships", url: "http://swapi.co/api/starships/"}
];
var prepareData = function () {
var storedData = [];
return {
add: function(resData){
storedData.push(resData);
},
getAll: function(){
return storedData;
}
};
}();
// Update status message once all requests finish
// and promises are settled
var requests = endpoints.map(function (endpoint) {
console.log('##################################################');
console.log('Requested info for ' + endpoint.name);
console.log('##################################################');
return fetch( endpoint.url, { method: 'GET'})
.then(function(res) {
return res.json();
});
});
function settled(promises) {
var alwaysFulfilled = promises.map(function (p) {
return p.then(
function onFulfilled(value) {
return {
state: 'fulfilled',
value: value
};
},
function onRejected(reason) {
return {
state: 'rejected',
reason: reason
};
}
);
});
return Promise.all(alwaysFulfilled);
}
/**
* Business Logic
*/
settled(requests)
.then(function (aggregatedResponses) {
//console.log('aggregatedResponses: -> ', aggregatedResponses);
// test each response for resolved: fulfilled
aggregatedResponses.forEach(function (outcome) {
if (outcome.state == 'fulfilled'){
prepareData.add(outcome);
};
});
})
.then(function(){
console.log("Stored aggregatedResponses: -> ", prepareData.getAll());
});