-4

promiseSettle must returns a Promise that is fulfilled when all promises in input are settled (meaning, either resolved or rejected).

The fulfillment value will be an array of objects, each having the following signature:

  • @typedef {Object} Settlement
  • @property {boolean} isFulfilled - whether the promise resolved
  • @property {boolean} isRejected - whether the promise rejected
  • @property {*=} value - the value (if any) with which the promise was resolved
  • @property {*=} reason - the reason (if any) with which the promise was rejected
  • @param {Array.>} input - an array of Promises
  • @return {Promise.>}

    function promiseSettle(input) {
        let promiseArray = [];
        for (let i = 0; i < input.length; i++) {
            Promise.resolve(input[i]).then(output => {
                promiseArray.push(output);
                console.log(promiseArray);
            }, reason => {
                promiseArray.push(reason);
            })    
        }
    }
    
    // testing data
    var p1 = new Promise((resolve, reject) => {
        setTimeout(reject, 1, "first promise of 1 sec");
    });
    var p2 = new Promise((resolve, reject) => {
        setTimeout(resolve, 1, "second promise of 2 sec");
    })
    var p3 = new Promise((resolve, reject) => {
        setTimeout(resolve, 1, "rejected promise");
    })
    promiseSettle([p1, p2, p3])
    

Can someone help with this? I am not sure how to return the promise with the expected parameters.

sǝɯɐſ
  • 2,470
  • 4
  • 33
  • 47
Rakesh Nallam
  • 235
  • 2
  • 6
  • 17

1 Answers1

1

This should do it.

function promiseSettle(inputList) {
  let promiseArray = inputList.map(
    input => {
      return new Promise((resolve, reject) => {
        input.then(
          value => {
            resolve({
              isFulfilled: true,
              isRejected: false,
              value
            });
          },
          reason => {
            resolve({
              isFulfilled: false,
              isRejected: true,
              reason
            });
          }

        );
      });
    }
  );
  
  return Promise.all(promiseArray);
}

// testing data
var p1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 1, "first promise of 1 sec");
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2, "second promise of 2 sec");
})
var p3 = new Promise((resolve, reject) => {
  setTimeout(reject, 1, "rejected promise");
})

promiseSettle([p1, p2, p3]).then(
  promises => {
    console.log(promises);
  }
);
Intervalia
  • 10,248
  • 2
  • 30
  • 60