Search code examples
javascriptnode.jsamazon-web-servicesamazon-dynamodbes6-promise

Promise.all() - Rejection Id 2 - Not receiving data


I am seeing unexpected behavior when calling Promise.all(). I can't seem to get the desired data. When the promise is called directly the data returns just fine, but calling Promise.all() throws following error:

2018-04-09T16:31:35.827Z    77ea5111-3c13-11e8-9800-a5b8cf1bf96f    (node:1) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'streak' of undefined

This is the relevant code:

function getUserData(UserId) {
  const docClient = new AWS.DynamoDB.DocumentClient();
  const params = {
    TableName: "XXXXXXXXXX",
    Key: {
      "UserId": UserId,
    }
  };

  return docClient.get(params).promise();
}

function buildResponse (UserId, weekNumber, yesterday, today, lastLogin) {
    let currentStreak

    getUserData(UserId);

    getUserData(UserId).then((data) => {    
    currentStreak = data.Item.streak;
    console.log("Streak is " + currentStreak); //Successfully returns "Streak is 22"
     });


    Promise.all([getUserData(UserId)]).then((data) => { //Throws error shown below
    var test = data.Item.streak;
    console.log("Promise is " + test);
    });

}

Note: I would like to add multiple promises in the future but I am just starting with one for now.


Solution

  • Promise.all() returns an array, you need to destructure the response:

    Promise.all([getUserData(UserId)]).then(([data]) => { 
      var test = data.Item.streak;
      console.log("Promise is " + test);
    });
    

    or:

    Promise.all([getUserData(UserId)]).then((response) => { 
      var [data] = response;
      var test = data.Item.streak;
      console.log("Promise is " + test);
    });
    

    or extract the data by index:

    Promise.all([getUserData(UserId)]).then((response) => { 
      var data = response[0];
      var test = data.Item.streak;
      console.log("Promise is " + test);
    });
    

    additionally you should have .catch() blocks to ensure that errors don't bubble up.