javascript - 我应该总是“等待”每一个承诺吗?
问题描述
我很难找到最近困扰我的问题的答案。我应该永远await
信守承诺吗?
我是什么意思?
假设我有一个返回承诺的函数,但我没有对从该承诺返回的值做任何事情。我还应该等待吗?还是我应该把它留在尝试捕获中
我应该等待返回 Promise 的函数吗?
const specialFunction = async () => {
try {
await handleEventsInsertion(body)
} catch (error) {
logger.error(error)
}
}
该handleEventsInsertion
方法是将事件实际插入数据库的方法。但我没有对这个方法返回的承诺做任何事情。所以我应该等待吗?如果存在拒绝,则会导致未处理的拒绝
有没有我不应该await
承诺的情况?
解决方案
不,你并不总是需要await
承诺。但是,为了确保正确的应用程序流程,您应该随时准备好处理发生的任何错误。
如果你不await
承诺,你应该实现catch
回调。因此,无论是您在问题中编写的代码,还是类似于以下内容的代码:
const specialFunction = () => {
handleEventInsertion(body)
.catch(error => {
logger.error(error);
});
}
您可以选择不这样做,但正如您已经说过的那样:如果发生错误而您没有try
//承诺或await
错误,它将被视为未处理的拒绝。catch
.catch
编辑:
至于您的另一个问题:是否存在您不应该等待承诺的情况?
是的。如果您正在响应需要在触发可能需要一段时间后立即报告的用户操作,您希望异步处理该操作并且您不想等待它完成。但是,在这种情况下,您调用的异步函数应该处理错误。举个例子:
const onClick = () => {
handleEventInsertion(body); // asynchronous function
alert("Thanks, we'll take it from here");
};
const handleEventInsertion = async (body) => {
try {
const result = await performLengthyAsyncOperation(body);
alert(`${result} inserted successfully`);
} catch (error) {
logger.error(error);
}
// or using the callbacks instead of try/await/catch:
performLengthyAsyncOperation(body)
.then(result => {
alert(`${result} inserted successfully`);
}).catch(error => {
logger.error(error);
});
};
编辑 2:
如果您出于某种原因真的不想使用await
,还有一个替代解决方案:您可以捕获未处理的拒绝错误。
window.onunhandledrejection = (error) => {
logger.error(error);
};
如果你这样做,如果处理总是相同的,你就不需要到处捕捉错误。await
在这种情况下,只有当您需要函数的结果或特定错误需要特殊处理时,您才会做出承诺。
推荐阅读
- elasticsearch - 根据 Elastic Search 中过滤器的最后一个条目进行分组
- laravel - 带有 User 和 Auth 的 Laravel 查询构建器
- oracle - ORACLE DB 安装:INS-32101 指定的 Oracle Home 用户不存在
- ios - Swift Combine (UIKit) 中的双向绑定
- spring-boot - Spring Boot 重定向到另一个 url
- javascript - javascript 从数据中获取像 sql 一样的 DISTINCT 计数
- javascript - 如何在手机网站上制作转发按钮,使用内部转发功能
- c# - 验证(HTML5):.aspx 网络表单不支持元素“app-root”
- python - 如何拆分标题行以创建新列?
- highcharts - Higcharts:当有不同颜色的 plotBand 时,如何在图表上渲染背景文本?