如何在异步函数调用中添加错误处理?

发布于 2025-02-11 20:46:40 字数 1191 浏览 0 评论 0原文

当前的打字稿代码有以下操作:

  React.useEffect(() => {
    if (prepAttrsRef.current) {
      prepAttrsRef.current.addEventListener('documentstatechanged', 
      async (evt: CustomEvent<FlowDocumentState>) => {
        if (evt.detail.draftState === 'all-changes-published') {
          dispatch(updateIsFlowpublished(true));
          let cleanSteps: readonly CleanStep[] = [];
          if (prepAttrsRef.current) {
            cleanSteps = await prepAttrsRef.current.getAllStepsOfTypeAsync('clean');
            if (cleanSteps && cleanSteps.length > 0 && cleanSteps[0] !== undefined) {
              await cleanSteps[0].selectAsync();
            }
          }
        }
      });
    }
    return () => {
      //TBC: cleanup
    };
  }, []);

现在我们知道selectasync()方法返回承诺:

selectAsync(): Promise<SelectResponse>

selectresponse可以包含错误消息:

SelectResponse: { success: true } | { errorMessage: string; errorType: SelectError; success: false }

因此,在这种情况下,如何添加错误将代码处理到等待CleanSteps [0] .Selectasync();是否应该在此处删除关键字?

Currently the typescript code has this:

  React.useEffect(() => {
    if (prepAttrsRef.current) {
      prepAttrsRef.current.addEventListener('documentstatechanged', 
      async (evt: CustomEvent<FlowDocumentState>) => {
        if (evt.detail.draftState === 'all-changes-published') {
          dispatch(updateIsFlowpublished(true));
          let cleanSteps: readonly CleanStep[] = [];
          if (prepAttrsRef.current) {
            cleanSteps = await prepAttrsRef.current.getAllStepsOfTypeAsync('clean');
            if (cleanSteps && cleanSteps.length > 0 && cleanSteps[0] !== undefined) {
              await cleanSteps[0].selectAsync();
            }
          }
        }
      });
    }
    return () => {
      //TBC: cleanup
    };
  }, []);

Now we know that selectAsync() method returns a promise:

selectAsync(): Promise<SelectResponse>

And the SelectResponse could contain error message:

SelectResponse: { success: true } | { errorMessage: string; errorType: SelectError; success: false }

So in this case, how to add error handling code to await cleanSteps[0].selectAsync(); ? Should the await keyword to be removed here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苍风燃霜 2025-02-18 20:46:40

因此,基本上SelectAsync方法处理错误(抛出和错误的错误),并根据成功或故障返回响应对象。

您可以通过这种响应

const response = await cleanSteps[0].selectAsync();

并检查

const response = await cleanSteps[0].selectAsync();
if (response.success) {
   // Do some success handling
} else {
  // Do some error handling, you have { errorMessage: string; errorType: SelectError; success: false } object here
}

它实际上取决于您在每种情况下要做什么。

如果您想知道如何处理async函数错误,那么您需要包装可能会引发错误的内容,然后尝试使用catch block

prepAttrsRef.current.addEventListener(
  'documentstatechanged',
  async (evt: CustomEvent<FlowDocumentState>) => {
    try {
      if (evt.detail.draftState === 'all-changes-published') {
        dispatch(updateIsFlowpublished(true));
        let cleanSteps: readonly CleanStep[] = [];
        if (prepAttrsRef.current) {
          cleanSteps = await prepAttrsRef.current.getAllStepsOfTypeAsync(
            'clean'
          );
          if (
            cleanSteps &&
            cleanSteps.length > 0 &&
            cleanSteps[0] !== undefined
          ) {
            await cleanSteps[0].selectAsync();
          }
        }
      }
    } catch (error) {
      // Do some error handling
    }
  }
);

async/等待

So basically selectAsync method handles errors (those that are throw as and Error) and returns response object depending on success or failure.

You can get that response by

const response = await cleanSteps[0].selectAsync();

And check

const response = await cleanSteps[0].selectAsync();
if (response.success) {
   // Do some success handling
} else {
  // Do some error handling, you have { errorMessage: string; errorType: SelectError; success: false } object here
}

It really depends on what you want to do in each scenario.

If you want to know how to handle async function errors in general then you need to wrap content that might throw an error with try catch block

prepAttrsRef.current.addEventListener(
  'documentstatechanged',
  async (evt: CustomEvent<FlowDocumentState>) => {
    try {
      if (evt.detail.draftState === 'all-changes-published') {
        dispatch(updateIsFlowpublished(true));
        let cleanSteps: readonly CleanStep[] = [];
        if (prepAttrsRef.current) {
          cleanSteps = await prepAttrsRef.current.getAllStepsOfTypeAsync(
            'clean'
          );
          if (
            cleanSteps &&
            cleanSteps.length > 0 &&
            cleanSteps[0] !== undefined
          ) {
            await cleanSteps[0].selectAsync();
          }
        }
      }
    } catch (error) {
      // Do some error handling
    }
  }
);

Promise chain in async/await

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文