javascript - 当基于 promise 的模式关闭时,处理后续错误的良好模式是什么?

标签 javascript functional-programming

假设您有一个用于生成模态的 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/

相关文章:

javascript - 使用流实现去抖分块异步队列

javascript - 元素 li 的 onmouseover 不起作用

Scala:UI 对象/渲染器的设计模式

functional-programming - 支持运算符作为一等公民的语言如何遵守运算顺序?

scala - 环境 monad 中术语环境的含义

scala - 功能流水线scala

JavaScript 根据浏览器时区更改我的日期

javascript - jQuery UI Selectables - 从对象外部开始拖动选择

javascript - Breeze.js/NET+EF复杂对象行为比较奇怪

java - 清理Java8中的数据列表