假设您有一个用于生成模式的API,用于询问用户的值,并且创建该模态的调用将返回一个可以解析为给定值的promise,或者如果该模式被关闭/取消则拒绝。例如:
prompt("Enter a value.").then(val => { }).catch(() => { /* closed */ });
我所看到的处理已关闭模态的拒绝承诺的建议模式是只添加catch
语句,其中包含“无操作”lambda,就像上面看到的那样。这样做的问题是,如果你想在modal 成功时构建到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
语句,并用新语句捕获它们,但请记住,只有模态成功时才能执行这些块,因此可以不要追求上述catch
声明。
你会做什么?
答案 0 :(得分:1)
我最近也实现了类似的东西,我的方法是如果模式被关闭或取消,模式将返回undefined
。我尝试为{true}错误保留catch()
。
但是,您还可以记住,throw
可以Error
,而不仅仅是throw
。所以,换句话说,你可以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);
});
让你认识到模态被关闭的东西,并且在那种情况下什么都不做;否则,继续处理异常。
$ closest-features --closest --no-overlaps --delim '\t' --dist --ec megatrans_enhancers.sorted.bed ../../data/alu_repeats.sorted.bed | awk -v OFS='\t' '{if ($15 <= 1000 || $15 >= -1000) print $0}' | wc -l
1188