假设您必须调用异步函数,但是您对该函数的成功/失败情况并不真正感兴趣。在这种情况下,以下所述的两种模式相对于调用堆栈,回调队列和事件循环有什么优缺点
模式1
async setSomething() {
try {
set(); // another async function
} catch (err) {
// log the error here
}
return true;
}
模式2
async setSomething() {
try {
await set(); // another async function
} catch (err) {
// log the error here
}
return true;
}
答案 0 :(得分:1)
模式1不会捕获set
函数中异步操作期间可能发生的任何错误-任何错误都将导致未处理的Promise拒绝,应避免。模式1仅捕获在set
的同步操作期间发生的错误(例如,在设置fetch
请求时),在大多数情况下不太可能发生
示例:
// open your browser's console to see the uncaught rejection
const set = () => new Promise((_, reject) => setTimeout(reject, 500));
async function setSomething() {
try {
set(); // another async function
} catch (err) {
console.log('err');
}
return true;
}
setSomething();
因此,模式2可能更可取。如果您不关心异步调用的结果,则不要await
或在调用.then
时调用setSomething()
。
或者,对于这种简单的事情,您可以考虑仅使用Promise
方法,而无需使用async
函数:
const setSomething = () => set()
.catch((err) => {
// log the error here
});
答案 1 :(得分:0)
此答案是对问题的非常规建议,而不是对OP发布的示例的实际答案。
对该功能的成功/失败情况并不真正感兴趣
如果是上述情况,则意味着返回不依赖于异步调用的结果。
当您不担心异步调用的返回时,最好不要使用async/await
或任何类型的promise
。您可以像调用其他函数一样调用该函数,并使用其余代码进行处理。