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());
});