首页 > 解决方案 > 如何在承诺中抛出异常?

问题描述

有一个函数可以处理来自扫描的响应:

export const handleScanResponse = (
  scanResponse: IScanResponse,
  visitors: IVisitor[]
): Promise<IVisitor | any> => {
  return new Promise((resolve, reject) => {
    if (!scanResponse || scanResponse.errorDesc !== "SUCCESS")
      throw new Error("Scane response is empty!");

    const found = visitors.find((p: IVisitor) => {
      if (scanResponse && "qrcode" in scanResponse) {
        return (
          p.code && p.code.toLowerCase() === scanResponse.qrcode.toLowerCase()
        );
      } else {
        return (
          p.document_number &&
          scanResponse.document_number &&
          p.document_number.toLowerCase() ===
            scanResponse.document_number.toLowerCase()
        );
      }
    });

    if (found) resolve(found);

    reject(scanResponse);
  }).catch((e) => console.log(e));
};

我尝试resolve, reject在找到用户但在数组中找不到用户的情况下。否则尝试抛出异常。

使用的是:

  handleScanResponse(
      scanerResponseMockup,
      this.visitorsService.visitors$.getValue()
    ).then(
      (foundVisitor) => this.visitorWasFound(foundVisitor),
      (scanResponse) => this.visitorNotFound(scanResponse)
    );

如何正确地做到这一点?为什么尽管有例外我总是去.then( (foundVisitor) => this.visitorWasFound(foundVisitor)

标签: javascripttypescriptpromise

解决方案


当 a.catch被添加到 Promise 链的末尾,并且抛出了一些东西时,整个 Promise 链将解析而不是拒绝。您的

.catch((e) => console.log(e));

正在将拒绝转化为决议;返回的承诺handleScanResponse永远不会拒绝。

仅在您可以合理处理它们的地方捕获错误。在这里,只需省略.catch,它应该可以按需要工作;这样,被拒绝的 Promise 将简单地渗透到调用者,并且您的

).then(
  (foundVisitor) => this.visitorWasFound(foundVisitor),
  (scanResponse) => this.visitorNotFound(scanResponse)
);

将能够处理它。

也就是说,这里的代码中似乎没有任何异步发生。我建议完全删除 Promise。


推荐阅读