Promise.all() - 拒绝ID 2 - 不接收数据

时间:2018-04-09 17:11:20

标签: javascript node.js amazon-web-services amazon-dynamodb es6-promise

调用Promise.all()时,我看到了意外的行为。我似乎无法获得所需的数据。直接调用promise时,数据返回正常,但调用Promise.all()会抛出以下错误:

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

这是相关代码:

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

}

注意:我想在未来添加多个承诺,但我现在只是从一个承诺开始。

2 个答案:

答案 0 :(得分:2)

Promise.all()返回一个数组,你需要对响应进行解构:

JsonResponse

或:

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

或通过索引提取数据:

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

另外你应该有.catch()块来确保错误不会冒出来。

答案 1 :(得分:0)

正如@Hunter所指出的那样,Promise.all解析了所有个别承诺结果的数组。数组不具有Item属性,因此data.Item未定义,因此访问data.Item.streak会为您提供您所看到的错误。

但是,看起来您应该使用Promise.all()。您实际上只是等待一个承诺,并且不必要地将它包装在一个数组中。尝试将其与阵列括号一起取出:

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