假设您有一个用于生成模态的 API,该模态要求用户提供一个值,并且创建该模态的调用返回一个 promise ,该 promise 要么解析为给定的值,要么在模态关闭/取消时拒绝。示例:
prompt("Enter a value.").then(val => { }).catch(() => { /* closed */ });
我所看到的用于处理封闭模态的拒绝 promise 的建议模式是仅添加一个带有“无操作”lambda 的 catch
语句,就像您在上面看到的那样。这样做的问题是,如果您想在模式 成功时构建到 promise 链上,那么后续逻辑中的任何错误也将由于“无操作”lambda 而静默失败:
prompt("Enter a value.")
.then(val => { /* logic that could throw an error */ })
.then(() => { /* method that may return another promise */ })
.catch(() => { }) // Silent fail
.then(() => { /* logic after modal */ })
一个明显的解决方案是将 then
语句移动到“无操作”捕获之后,并用新语句捕获它们,但请记住,这些 block 必须仅在模式成功时执行,因此不能执行上述 catch
语句。
你会怎么做?
最佳答案
我最近也实现了类似的东西,我的方法是如果模式被关闭或取消,它会返回 undefined
。我尝试为“真实”错误保留 catch()
。
但是,您还可以记住,您可以抛出
任何东西,而不仅仅是错误
。因此,或者,您可以抛出
一些东西,让您认识到模式已关闭,在这种情况下什么也不做;否则,继续处理异常。
prompt.CLOSE_SIGNAL = Symbol('prompt.CLOSE_SIGNAL');
prompt('Enter a value.')
.then(/* ... */)
.catch(ex => {
if (ex === prompt.CLOSE_SIGNAL) return;
// Otherwise:
console.error('Error from modal:', ex);
});
关于javascript - 当基于 promise 的模式关闭时,处理后续错误的良好模式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50518912/