javascript - 如何在承诺中抛出异常?
问题描述
有一个函数可以处理来自扫描的响应:
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)
?
解决方案
当 a.catch
被添加到 Promise 链的末尾,并且抛出了一些东西时,整个 Promise 链将解析而不是拒绝。您的
.catch((e) => console.log(e));
正在将拒绝转化为决议;返回的承诺handleScanResponse
永远不会拒绝。
仅在您可以合理处理它们的地方捕获错误。在这里,只需省略.catch
,它应该可以按需要工作;这样,被拒绝的 Promise 将简单地渗透到调用者,并且您的
).then(
(foundVisitor) => this.visitorWasFound(foundVisitor),
(scanResponse) => this.visitorNotFound(scanResponse)
);
将能够处理它。
也就是说,这里的代码中似乎没有任何异步发生。我建议完全删除 Promise。
推荐阅读
- python - 如何从前一个整数中减去数组中的每个整数并求和
- c# - 发送 SMTP 邮件时我的 XML 文件中有奇怪的字符
- java - 邮编附件 > 300K CXF 给出 EOFException
- java - 如何在android中创建具有X轴和Y轴值的动态条形图
- botframework - Microsoft Bot Framework - 移交给代理
- android - 我怎么能延迟相机预览,以便它显示 x 秒前发生的事情?
- pandas - 将 Pandas DataFrames 与规则合并
- ruby-on-rails - 如何在 Ruby on Rails 中进行猴子补丁
- reactjs - Gatsby 编译失败
- python - 使用户激活链接过期并从 django 中的数据库中删除