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)