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