【问题标题】:Correct way to pass async eerror传递异步错误的正确方法
【发布时间】:2018-04-08 20:17:33
【问题描述】:

我有一个使用 Firebase 身份验证来更新用户电子邮件的功能:

export const updateEmail = async (email) => {
  const user = auth.currentUser;
  return user.updateEmail(email);
};

它用于从表单(在 React 中)获取电子邮件并尝试更新电子邮件的函数中。如果出现错误,我们会更改状态以反映这一点。

handleSave = (e) => {
  const email = e.target.email.value;

  updateEmail(email).catch((err) => {
    this.setState({ didError: true, emailError: err.message });
  });
};

但是,当发生错误时,在控制台中我得到:

我的问题是:为什么这仍然说“未捕获”? handleSave 中的 .catch() 不处理这个问题吗?

更新

Link to relevant Firebase docs

【问题讨论】:

  • 我没有使用 firebase 的经验,但就从异步函数结果(这是一个承诺)中捕获错误而言,这对我来说看起来不错。
  • 你在哪里使用await
  • @ArupRakshit 你建议我在哪里使用await
  • 您没有在异步函数中返回任何错误。我认为这就是为什么您没有收到任何错误和 error.message 的原因。此外,如前所述,您没有在异步函数中使用 await 。我会尝试添加一个答案。
  • @devserkan 澄清一下,this.setState() 中的错误消息设置正确。

标签: javascript reactjs firebase firebase-authentication


【解决方案1】:

假设 updateEmail 返回一个 prmise,我想你可以试试:

export const updateEmail = (email) => { // no need for async here
  const user = auth.currentUser;
  return user.updateEmail(email); 
};


handleSave = async (e) => {
  const email = e.target.email.value;
  try{
    await updateEmail(email); 
  }catch(err){
    this.setState({ didError: true, emailError: err.message });
  }
};

【讨论】:

  • 删除async 解决了这里的问题。谢谢!你能解释一下为什么会这样吗?
  • 因为 updateEmail 本身不需要是异步操作,因为它返回一个承诺,所以不使用数据本身。您正在 handleSave 函数中使用返回的承诺。所以,它现在是异步的。然后你正在使用 try/catch 来处理操作。 await 处理返回的 promise,如果有错误返回 catch 使用它。
【解决方案2】:

我不太确定,因为我对 Firebase 了解不多,请允许我提出一些建议。

export const updateEmail = async (email) => {
    const user = auth.currentUser;
    const response = await user.updateEmail(email);
    if ( response.error ) {
        throw new Error( response.error );
    }
    return "something else";
};

【讨论】:

  • 我不太确定代码是否有效,因为我不知道 auth.currentUser 如何返回响应。但不知何故,如果发生错误,它会返回类似错误之类的其他内容。
  • 感谢您的回复,但如果电子邮件无效,user.updateEmail() 会抛出错误。您是否建议在其中的.catch() 中抛出错误?
  • user.updateEmail(email).catch(err => throw Error(err))?
  • 我已经编辑了我的答案,但我认为我们的想法是错误的。您可以按照@nikksan 的建议处理handleSave 中的情况。因此,updateEmail 正确地返回了一个带有错误拒绝的承诺。我是多么蹩脚:)
猜你喜欢
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2016-09-29
  • 2013-08-13
  • 1970-01-01
  • 2021-12-02
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多