Javascript 在可重用的获取函数中处理错误
我正在编写一个可重用的fetch函数(它将存在于一个单独的文件中),我不太确定处理返回null的函数的最佳方法 假设我想在Javascript 在可重用的获取函数中处理错误,javascript,typescript,Javascript,Typescript,我正在编写一个可重用的fetch函数(它将存在于一个单独的文件中),我不太确定处理返回null的函数的最佳方法 假设我想在getOrganizationInfo不返回组织信息时调用该函数并应用一些逻辑。目前,我的函数返回一个错误,但落入第一个if(organization)块,我无法真正处理它。然后,我需要使用该错误消息在handleSubmit中使用它,例如showError(error)。我应该如何利用这个逻辑 const orgName = 'ABC'; const handleSubm
getOrganizationInfo
不返回组织信息时调用该函数并应用一些逻辑。目前,我的函数返回一个错误,但落入第一个if(organization)
块,我无法真正处理它。然后,我需要使用该错误消息在handleSubmit中使用它,例如showError(error)
。我应该如何利用这个逻辑
const orgName = 'ABC';
const handleSubmit = async () => {
const organization = await getOrganizationInfo(orgName);
if (organization) {
// Do something
} else {
// Do something else
}
}
这是我的函数
export const getOrganizationInfo = async (
organizationName: string,
): Promise<OrganizationInfoResponse> => {
let organizationInfoResponse: OrganizationInfoResponse;
try {
const rawRes = await fetch(`/sometestendpoint/${organizationName}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
organizationInfoResponse = await rawRes.json();
if (rawRes.status >= 400) {
if (organizationInfoResponse.errorCode === ErrorCodes.INVALID_ORG_NAME) {
throw new Error('Given Organization Name is invalid');
} else {
throw new Error('Unable to get organization information.');
}
}
} catch (error) {
// organizationInfoResponse = error.toString();
throw new Error(error.toString());
}
return organizationInfoResponse;
};
导出常量getOrganizationInfo=async(
organizationName:string,
):承诺=>{
让组织信息响应:组织信息响应;
试一试{
const rawRes=await fetch(`/sometestendpoint/${organizationName}`{
方法:“GET”,
标题:{
“内容类型”:“应用程序/json”,
},
});
organizationInfoResponse=await rawRes.json();
如果(rawRes.status>=400){
if(organizationInfoResponse.errorCode==ErrorCodes.INVALID\u ORG\u NAME){
抛出新错误('给定的组织名称无效');
}否则{
抛出新错误('无法获取组织信息');
}
}
}捕获(错误){
//organizationInfoResponse=error.toString();
抛出新错误(Error.toString());
}
返回组织信息响应;
};
问题中提供的代码在进入catch
块时将执行以下操作:
- 它执行
抛出新错误(Error.toString())
- 以下表达式中的承诺将被拒绝:
等待getOrganizationInfo(orgName)
返回的承诺将被拒绝handleSubmit
- 此
下面的wait
中的任何代码都不会执行handleSubmit
catch
块没有throw
,而是有注释行:
catch (error) {
organizationInfoResponse = error.toString();
}
在这种情况下,代码将“落入if
”,因为这样错误就会被上述catch
块吞没:
- 该函数继续执行
返回organizationInfoResponse
- 下面表达式中的承诺将实现:
等待getOrganizationInfo(orgName)
- 还原
的函数执行上下文,并为组织handleSubmit
分配履行值(即
)error.toString()
条件是真实的,因此执行if(组织)
块if
else
块,请使用throw
版本的代码,然后在handleSubmit
中引入try…catch
块,或者(更简单的)链a。然后
和。catch
调用承诺:
const handleSubmit = () => {
return getOrganizationInfo(orgName).then(organisation => {
if (!organisation) throw new Error("Organisation is falsy");
// Do something
}).catch(error => {
// Do something else
});
}
“此时,我的函数返回一个错误,但落入第一个if(组织)块”:您共享的代码不会这样做。如果
getOrganizationInfo
抛出错误,则返回的handleSubmit
承诺将被拒绝,而不会执行If…else
块。可能我对它的描述不正确<代码>组织信息响应=error.toString()返回属于if
true块的字符串。无论哪种方式,所有选项都不会给出期望的结果。如果出现错误,我会尽力让它转到else。是否落入if
块?这里不可能发生这种情况:当执行catch
块时,您在那里抛出了一个错误——没有返回值。因此,handleSubmit
中的wait
将阻止在handleSubmit
中进一步执行代码。在这种情况下,也不会执行if
,也不会执行else
。