调用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);
});
}
注意:我想在未来添加多个承诺,但我现在只是从一个承诺开始。
答案 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);
});