函数式编程在实际项目中的运用(错误判断)

416 阅读2分钟

函数式编程中为什么错误难以捕获

  • 函数们通过compose或者composeAsync方法(点击这里查看我上一篇关于函数式编程的文章)组成之后其本身也是一个函数。
  • 函数接收的参数是无法来中断这个函数的执行的
  • 可中断函数执行的方法很少
  • 用来组成compose的函数们自身也有可能出错

可以使用哪些方法捕获错误

  • 可以写两个工具函数,一个是可以将接受的函数通过maybe函子包裹之后在返回;另外一个是与之对应的,也同样接受一个函数,不过这个函数接受的参数会自动通过.of()的方式去获取,然后正常使用
  • 写一个工具函数,用来判断接受的参数是否合规,不合规直接通过throw的方式主动抛出一个错误来中断函数执行

个人想法

  • 肯定还有其他更加合理且优雅的方式来捕获错误,只是我目前没有发现而已
  • 第一种方式相对于第二种来说其实更加符合函数式编程的规范,而且在这里好歹也用到了一点关于涵子的知识。但是使用这种方式的话,就会造成compose方法使用时比较怪异。不过使用这种方式来处理错误捕获是我下一步的目标

目前我所采用的是通过抛出异常的方式

  • throw方法可以直接中断函数执行,在性能上也是有稍稍稍微的优势的
  • 简单,粗暴,有用
  • 工具函数
/**
 * @function
 * -- 判断是否抛出异常的条件
 * - 是promise arg instanceof Promise
 * - 是undefined !arg
 * - 是null !arg
 */
export const maybeBreak = curry((func: Function, arg: any) => {
  // eslint-disable-next-line @typescript-eslint/no-throw-literal
  if (!arg || arg instanceof Promise) throw `函数: ${func.name} 因参数问题执行失败`;
  return func(arg);
});
  • 使用方式
const rejectWithdrawCurried = curry((arg: string, close: () => void) => {
  composeAsync<string, void>(
    verifyRejectCause,
    maybeBreak(rejectWithdrawRequest),
    responseAfter,
  )(arg);
});