当基于承诺的模态关闭时,处理后续错误的好模式是什么?

时间:2018-05-24 22:13:47

标签: javascript functional-programming

假设您有一个用于生成模式的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声明。

你会做什么?

1 个答案:

答案 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