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,所以我看不出这有什么关系。我想他是在说,简单地捕捉并只重新抛出错误是没有意义的。在这种情况下,不妨省略捕获并让它冒泡。许多相同的错误处理最佳实践都适用,无论是同步的还是异步的。我的意图不是告诉他们捕获并重新抛出错误,而是防止错误冒泡到顶层,就像他们共享的示例中所做的那样。