【问题标题】:Throwing errors in async await functions and catching from where it's called在异步等待函数中抛出错误并从调用它的位置捕获
【发布时间】:2021-04-10 01:03:06
【问题描述】:

我们如何从调用它的异步等待函数中捕获错误?

例如,我有一个 React 组件,它调用从另一个模块导入的异步等待函数。当我在该函数中使用 Promise.reject("An unknown has occurred"); 时,在我的 React 组件中为什么我不能在 asyncAwaitFunction.catch((e)=>console.log(e)) 中得到错误?

我什至尝试过throw "An unknown occured",但它似乎不起作用。

反应组件

const handleSubmit = async (e) => {
    e.preventDefault();
    add(formData, code)
      .then(() => router.push("/dashboard/manage"))
      .catch((e) => setError(e)); //I want error to be catched here
  };

functions.js

export const addUser = async (details, code) => {

 const isExist = await isUser(code);

 if (!isExist) {

  const add = db.batch();    //firebase batch write

  add.set(userID(code), details);    //Add details to databse

  add.commit()
   .catch((e)=> {
   console.log(e);    // error occurs confirmed
   Promise.reject("Unknown error occurred"); //this does't get catched in component.
  });
    
 } else {
   Promise.reject("Already Exists!"); 
 }
};

【问题讨论】:

  • await add.commit();
  • this works ...对此表示怀疑。你想返回或者抛出那个被拒绝的 Promise(或者直接抛出一个错误)
  • 我可能对那条线有误,之前我使用了以前可以工作的throw。不确定Promise.reject

标签: javascript reactjs asynchronous async-await es6-promise


【解决方案1】:

只有在以下情况下才会捕获被拒绝的 Promise(来自您构造的被拒绝的 Promise,或来自 Promise.reject):

  • .catch 被添加到 Promise 表达式的末尾,或者
  • Promise 表达式在异步函数或.then 内部返回,并且异步函数的调用者或在.then 回调之后,有一个.catch

所以,你应该改为:

export const addUser = async (details, code) => {
   const isExist = await isUser(code);
   if (isExist) {
      return Promise.reject('Already Exists!');
   }

   const add = db.batch();    //firebase batch write
   add.set(userID(code), details);    //Add details to databse
   return add.commit().catch((e) => {
      console.log(e);    // error occurs confirmed
      return Promise.reject("Unknown error occurred");
   });
};

但是你真的需要登录.commit().catch吗?如果没有,只返回 commit Promise 并在调用者中捕获会更干净:

export const addUser = async (details, code) => {
   const isExist = await isUser(code);
   if (isExist) {
      return Promise.reject('Already Exists!');
   }

   const add = db.batch();    //firebase batch write
   add.set(userID(code), details);    //Add details to databse
   return add.commit();
};

awaited 或从异步函数返回的 Promise 将使其错误(或其解析值)渗透到异步函数的调用者。

【讨论】:

  • 如果我可以为此添加更多选票,那将是一百万。
  • 完美!还要感谢更清洁的if 声明建议。顺便说一句,我仍然会返回commit.catch((e)=>Promise.reject("Unknown error occurrect")),因为我不想在我的组件中捕获整个错误对象,所以我会将它用于自定义消息,只是为了表明发生了一些错误,并且没有更多信息。跨度>
猜你喜欢
  • 2017-11-09
  • 1970-01-01
  • 2017-10-23
  • 2019-06-10
  • 1970-01-01
  • 2017-07-21
  • 2020-05-31
  • 1970-01-01
  • 2017-06-27
相关资源
最近更新 更多