Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在异步等待函数中抛出错误并从何处捕获';这叫什么_Javascript_Reactjs_Asynchronous_Async Await_Es6 Promise - Fatal编程技术网

Javascript 在异步等待函数中抛出错误并从何处捕获';这叫什么

Javascript 在异步等待函数中抛出错误并从何处捕获';这叫什么,javascript,reactjs,asynchronous,async-await,es6-promise,Javascript,Reactjs,Asynchronous,Async Await,Es6 Promise,我们如何从调用异步等待函数的位置捕获该函数的错误 例如,我有一个React组件,它调用从另一个模块导入的异步等待函数。当我使用Promise.reject(“发生未知事件”)console.log(e))中获得错误呢 我甚至试着抛出“未知事件”,但似乎不起作用 反应成分 const handleSubmit=async(e)=>{ e、 预防默认值(); 添加(表单数据、代码) 。然后(()=>router.push(“/dashboard/manage”)) .catch((e)=>setEr

我们如何从调用异步等待函数的位置捕获该函数的错误

例如,我有一个React组件,它调用从另一个模块导入的异步等待函数。当我使用
Promise.reject(“发生未知事件”)asyncwaitfunction.catch((e)=>console.log(e))
中获得错误呢

我甚至试着抛出“未知事件”
,但似乎不起作用

反应成分

const handleSubmit=async(e)=>{
e、 预防默认值();
添加(表单数据、代码)
。然后(()=>router.push(“/dashboard/manage”))
.catch((e)=>setError(e));//我希望在这里捕获错误
};
functions.js

export const addUser=async(详细信息,代码)=>{
const isExist=等待isUser(代码);
如果(!isExist){
const add=db.batch();//firebase批写入
add.set(userID(code),details);//向数据库添加详细信息
add.commit()
.catch((e)=>{
console.log(e);//发生错误
Promise.reject(“发生未知错误”);//这不会在组件中捕获。
});
}否则{
承诺。拒绝(“已经存在!”);
}
};
只有在以下情况下,才会捕获被拒绝的承诺(来自您构建的被拒绝承诺,或来自
承诺。拒绝
):

  • .catch
    添加到该承诺表达式的末尾,或
  • 该承诺表达式在异步函数或
    中返回。然后
    和异步函数的调用者或
    之后返回。然后
    回调,出现一个
    .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和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();
};

从异步函数执行或返回的承诺将使其错误(或其解析值)渗透到异步函数的调用方。

await add.commit()
此操作有效
。。。我怀疑。您想要返回或抛出被拒绝的承诺(或直接抛出错误)我可能对这一行错了,之前我使用的
throw
曾经有效。不确定是否承诺。拒绝。如果我能增加更多的选票,那将是一百万。太好了!还感谢清洁剂
if
声明建议。顺便说一句,我仍然会返回
commit.catch((e)=>Promise.reject(“未知错误发生”)
,因为我不想捕获组件中的整个错误对象,所以我会将其用于自定义消息,只是为了显示发生了一些错误,而没有更多信息。