Javascript 承诺之外未经处理的拒绝?

Javascript 承诺之外未经处理的拒绝?,javascript,reactjs,Javascript,Reactjs,因此,基本上我正在运行一些查询graphql api的代码,并检查其中的数据字段是否为null(这意味着查询没有命中),如下所示: //检查项目是否有可用数据。 //如果没有,抛出一条错误消息,说明哪些没有数据。 const testIfDataInDB=wait Promise.all(objIDs.map)(objID=>{ 返回fetch(“/api/graphql”{ 方法:“张贴”, 标题:标题, 正文:JSON.stringify({ 查询:“使用对象编号($objectNumber

因此,基本上我正在运行一些查询graphql api的代码,并检查其中的数据字段是否为null(这意味着查询没有命中),如下所示:

//检查项目是否有可用数据。
//如果没有,抛出一条错误消息,说明哪些没有数据。
const testIfDataInDB=wait Promise.all(objIDs.map)(objID=>{
返回fetch(“/api/graphql”{
方法:“张贴”,
标题:标题,
正文:JSON.stringify({
查询:“使用对象编号($objectNumber:String!){constructionDetail(objectNumber:$objectNumber){objectNumber}}查询获取对象”,
变量:{
对象编号:objID
}
}
)
})。然后(异步(res)=>{
返回{
responseData:wait res.json(),
objID:objID
}
}
)
}));
const itemsDataNotFound=testIfDataInDB.filter(o=>
o、 responseData?.data?.constructionDetail==null);
设errString=“”;
如果(itemsDataNotFound.length>0){
itemsDataNotFound.forEach(obj=>{
errString=errString+`${obj.objID},`;
});
errString=errString.slice(0,errString.length-2);
console.log(errString);
抛出新错误(errString);
}
// ... 做一些对象转换。。。
//继续使用fetch将某些项发布到另一个数据库中。
const response=wait Promise.all(objectsArr.map)(对象,索引)=>{
const body=JSON.stringify(obj);
如果(更新和索引===0){
const fetchUrl=`${baseFetchUrl}/${parentItemMetadata.\u id}`
回传(
获取URL{
方法:“放”,
标题:标题,
身体:身体
}
).then(res=>res.json())
}
回传(
baseFetchUrl{
方法:“张贴”,
标题:标题,
身体:身体
}
).then(res=>res.json())
}))
控制台日志(响应);
返回响应;
}

我在react组件中调用此代码的方式:

//在父级中定义
const saveMultipleItems=异步(
对象:字符串[],
更新:布尔值
) => {
常量parentItemMetaData:TypeLabelItemMetaData={
createdBy:currentItem?.createdBy | |“”,
createdAt:currentItem?.createdAt | |“”,
updatedBy:currentItem?.updatedBy | |“”,
updatedAt:currentItem?.updatedAt | |“”,
_id:currentItem?_id | |“”,
集合:currentItem?.collection | |“”
}
试一试{
保存多个(
对象,
labelType,
值作为TypeLabelState,
parentItemMetaData,
用户,
更新
)
}捕获(e){
控制台。警告(e.message);
}最后{
fetchItems();
}
//在子组件中调用
onSubmit={(e)=>{
e、 预防默认值();
log(“提交一个系列”)
试一试{
const pNumbersArray=generatarray(从objnumber到bjnumber);
saveSeriesFn(pNumbersArray,editMode);
}捕获(e){
console.log(“捕获错误”)
警报(“保存序列失败,消息“+e.message”);
}
}
}
我的计划是抛出一个错误,并在某个地方对此错误作出反应,在那里我可以显示一个警报,说明某些项目无法保存,并中止保存操作。我知道 我知道这可能不是最干净的方法(我也非常感谢你的建议)。我现在遇到的问题是,应用程序崩溃了,原因如下:

Unhandled Rejection (Error): P18100405117, P18100405118, P18100405119
saveMultiple
src/app/src/api/savemultiple.ts:70
  67 |     });
  68 |     errString = errString.slice(0, errString.length - 2);
  69 |     console.log(errString);
  70 |     throw new Error(errString);
     | ^  71 | }
  72 | 
  73 | const objectsArr: SaveTemplateObjType[] = objIDs.map((objID, index) => {

当我抛出这个错误的时候,我还以为我不在承诺之内呢?

Async/Await是承诺的合成糖

您的代码声明:
const saveMultiple=async(…

异步函数将始终返回一个承诺(参见下面的参考文献)

您的尝试/捕获在以下情况下不起作用:

试试看{
保存多个(
对象,
labelType,
值作为TypeLabelState,
parentItemMetaData,
用户,
更新
)
}捕获(e){
控制台。警告(e.message);
}最后{
fetchItems();
}
因为
saveMultiple
是异步的。您需要使用:

saveMultiple(
对象,
labelType,
值作为TypeLabelState,
parentItemMetaData,
用户,
更新
).catch((e)=>{
控制台。警告(e.message);
}).最后(()=>{
fetchItems();
})
发件人: