【问题标题】:How to throw exception inside promise?如何在承诺中抛出异常?
【发布时间】:2021-01-09 23:41:31
【问题描述】:

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

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) =&gt; this.visitorWasFound(foundVisitor)

【问题讨论】:

  • 在 Promise 构造函数中,你必须 resolve()reject()。在.then().catch() 回调中,您必须使用returnthrow

标签: javascript typescript promise


【解决方案1】:

.catch 被添加到 Promise 链的末尾并抛出了某些东西时,整个 Promise 链将解决而不是拒绝。你的

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

正在将拒绝转化为解决方案; handleScanResponse 返回的 Promise 永远不会拒绝。

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

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

会处理的。

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

【讨论】:

  • 那么,如果出现catch,什么时候使用呢? ——
  • 您使用 catch 来捕获错误。但这不是您想要的方法。你想扔在那里。你在想要处理的地方发现了一个错误。
  • @AliceMessis 你应该.catch 只有当你能合理地处理错误时。例如,如果你真的需要 Promise,你可以有一个 .catch((scanResponse) =&gt; this.visitorNotFound(scanResponse)) - 在那里,你可以采取一个很好的有用的行动来响应错误。相比之下,只记录错误的.catch 并没有真正的用处。
  • @AliceMessis 也可以看看这个:stackoverflow.com/q/24662289 通常你会想要.catch( 而不是.then(onSuccess, onFail)
猜你喜欢
  • 2017-06-03
  • 2015-04-02
  • 2014-06-13
  • 2018-04-05
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多