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

Javascript Promise.all()-拒绝Id 2-未接收数据,javascript,node.js,amazon-web-services,amazon-dynamodb,es6-promise,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): TypeEr

调用
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([getUserData(UserId)]).then(([data]) => { 
  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()块,以确保不会出现错误。

返回数组,您需要对响应进行分解:

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[0];
  var test = data.Item.streak;
  console.log("Promise is " + test);
});

此外,您还应该具有.catch()块,以确保不会出现错误。

正如@Hunter所指出的,
Promise.all
使用所有单个Promise结果的数组进行解析。数组没有
Item
属性,因此
data.Item
是未定义的,因此访问
data.Item.streak
会显示您看到的错误

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

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

正如@Hunter所指出的,
Promise.all
解析为一个包含所有单个Promise结果的数组。数组没有
Item
属性,因此
data.Item
是未定义的,因此访问
data.Item.streak
会显示您看到的错误

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

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

与synchronous
try/catch
一样,您不应该有任何
catch
块,除非您确实可以对错误采取措施。否则你会希望它们冒泡。这不是同步的try/catch,所以我看不出这有什么关系。我想他是在说,简单地捕捉并只重新抛出错误是没有意义的。在这种情况下,不妨省略catch,让它冒泡。许多相同的错误处理最佳实践都适用,无论是同步的还是异步的。我的意图不是告诉他们捕捉并重新抛出错误,而是防止错误冒泡到顶层,就像他们共享的示例中所做的那样。与同步
try/catch
,一样,您不应该有任何
catch
块,除非您确实可以对错误采取措施。否则你会希望它们冒泡。这不是同步的try/catch,所以我看不出这有什么关系。我想他是在说,简单地捕捉并只重新抛出错误是没有意义的。在这种情况下,不妨省略捕获并让它冒泡。许多相同的错误处理最佳实践都适用,无论是同步的还是异步的。我的意图不是告诉他们捕获并重新抛出错误,而是防止错误冒泡到顶层,就像他们共享的示例中所做的那样。