JavaScript, 承诺拒绝
JavaScript, Promise rejection
我正在努力创造这个承诺:
const getTocStatus = new Promise((resolve, reject) => {
const userInfo = Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
reject(new Error('Couldn\'t connect to Cognito'));
});
然后像这样使用它:
getTocStatus.then((response) => {
if (response === 'pending) { //do sth }
}, error => console.log('Error:', error)
但我收到错误:
[TypeError: undefined is not an object (evaluating 'userInfo.attributes['custom:tocStatus']')]
在 promise 上有什么错误的编码,它会调用什么?
你必须区分什么时候有错误,什么时候没有:
const getTocStatus = new Promise((resolve, reject) => {
try {
const userInfo = Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
}
catch (err) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
...或类似的东西。
问题是 Auth.currentUserInfo
给你一个承诺,而不是一个值,所以你需要等待它完成才能 return 它的内容。 Mario Vernari 也是正确的,因为您的错误处理也有问题,但这不是您的代码崩溃的原因。这应该有望解决这两个问题。
const getTocStatus = new Promise(async (resolve, reject) => {
try {
const userInfo = await Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
} catch (e) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
Lionel 的回答是正确的(我不知道 Auth.currentUserInfo
是什么,但是没有必要 Promise constructor 因为你已经在处理 promises:
const getTocStatus = async () => {
try {
const userInfo = await Auth.currentUserInfo()
return userInfo.attributes['custom:tocStatus']
} catch (e) {
new Error("Couldn't connect to Cognito")
}
}
// or with .then syntax
const getTocStatus = () =>
Auth.currentUserInfo()
.then((userInfo) => userInfo.attributes['custom:tocStatus'])
.catch((e) => { Promise.reject(new Error("Couldn't connect to Cognito")) })
最后我这样做了,但我会用这个来修复我的代码:
const getTocStatus = new Promise((resolve, reject) => {
try {
Auth.currentUserInfo()
.then(response => {
resolve(response.attributes['custom:tocStatus'] || TocStatus.CONFIRMED);
})
.catch(err => console.log(err));
} catch (err) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
并且:
getTocStatus.then((response) => {
console.log('response dentro del error', response);
if (response === 'pending') {
// do sth
}
}, error => console.log(error)
我正在努力创造这个承诺:
const getTocStatus = new Promise((resolve, reject) => {
const userInfo = Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
reject(new Error('Couldn\'t connect to Cognito'));
});
然后像这样使用它:
getTocStatus.then((response) => {
if (response === 'pending) { //do sth }
}, error => console.log('Error:', error)
但我收到错误:
[TypeError: undefined is not an object (evaluating 'userInfo.attributes['custom:tocStatus']')]
在 promise 上有什么错误的编码,它会调用什么?
你必须区分什么时候有错误,什么时候没有:
const getTocStatus = new Promise((resolve, reject) => {
try {
const userInfo = Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
}
catch (err) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
...或类似的东西。
问题是 Auth.currentUserInfo
给你一个承诺,而不是一个值,所以你需要等待它完成才能 return 它的内容。 Mario Vernari 也是正确的,因为您的错误处理也有问题,但这不是您的代码崩溃的原因。这应该有望解决这两个问题。
const getTocStatus = new Promise(async (resolve, reject) => {
try {
const userInfo = await Auth.currentUserInfo();
resolve(userInfo.attributes['custom:tocStatus']);
} catch (e) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
Lionel 的回答是正确的(我不知道 Auth.currentUserInfo
是什么,但是没有必要 Promise constructor 因为你已经在处理 promises:
const getTocStatus = async () => {
try {
const userInfo = await Auth.currentUserInfo()
return userInfo.attributes['custom:tocStatus']
} catch (e) {
new Error("Couldn't connect to Cognito")
}
}
// or with .then syntax
const getTocStatus = () =>
Auth.currentUserInfo()
.then((userInfo) => userInfo.attributes['custom:tocStatus'])
.catch((e) => { Promise.reject(new Error("Couldn't connect to Cognito")) })
最后我这样做了,但我会用这个来修复我的代码:
const getTocStatus = new Promise((resolve, reject) => {
try {
Auth.currentUserInfo()
.then(response => {
resolve(response.attributes['custom:tocStatus'] || TocStatus.CONFIRMED);
})
.catch(err => console.log(err));
} catch (err) {
reject(new Error('Couldn\'t connect to Cognito'));
}
});
并且:
getTocStatus.then((response) => {
console.log('response dentro del error', response);
if (response === 'pending') {
// do sth
}
}, error => console.log(error)