Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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_Typescript - Fatal编程技术网

Javascript 在可重用的获取函数中处理错误

Javascript 在可重用的获取函数中处理错误,javascript,typescript,Javascript,Typescript,我正在编写一个可重用的fetch函数(它将存在于一个单独的文件中),我不太确定处理返回null的函数的最佳方法 假设我想在getOrganizationInfo不返回组织信息时调用该函数并应用一些逻辑。目前,我的函数返回一个错误,但落入第一个if(organization)块,我无法真正处理它。然后,我需要使用该错误消息在handleSubmit中使用它,例如showError(error)。我应该如何利用这个逻辑 const orgName = 'ABC'; const handleSubm

我正在编写一个可重用的fetch函数(它将存在于一个单独的文件中),我不太确定处理返回null的函数的最佳方法

假设我想在
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