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



我在调用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);
    });
}

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

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

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

或按索引提取数据:

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

此外,您应该有 .catch(( 块以确保错误不会冒泡。

正如@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);
});

最新更新