用javascript组成(?)高阶函数

时间:2019-05-22 14:02:05

标签: javascript functional-programming ramda.js

我正在使用高阶函数来隔离一些不应该存在于我的主处理程序函数逻辑中的逻辑,这很好用,但是变得有点难看并且很难保持链接,我也不确定如何处理Arity:

export const handler = sqsEvent(tryCaptureThrow(myHandler))

在此示例中,我有2个HoF:sqsEventtryCaptureThrow,它们都接收一个fn并返回一个函数。 例如tryCaptureThrow

import { captureException } from '../utils/exception'

const tryCaptureThrow = (fn: any) => async (whatever: any) => {
  try {
    return await fn(whatever)
  } catch (e) {
    await captureException(e)
    throw e
  }
}

export default tryCaptureThrow

这是sqsEvent的样子:

import { SQSEvent } from 'aws-lambda'

import { captureException } from '../utils/exception'

const sqsEvent = (fn: any) => async (event: SQSEvent) => {
  try {
    const body = JSON.parse(event.Records[0].body)
    return fn(body)
  } catch (e) {
    await captureException(e, { event })
    return 'NOT-OK'
  }
}

export default sqsEvent

我有两点要改进:

1)fn接受的参数数量应该是隐式的-当前编码为定义为whatever的单个参数

2)链接更多的HoF应该比包装之前的fn更为简单。

我试图同时使用ramda来完成这两个任务,所以它看起来像:

export const handler = R.someMethod(sqsEvent, tryCaptureThrow, myHandler)

那可能吗?我正在寻找什么方法?

1 个答案:

答案 0 :(得分:0)

  

fn接受的参数数量应该是隐式的-当前编码为定义为whatever的单个参数

您可以为此使用rest参数和传播语法:

const tryCaptureThrow = (fn: any) => async (...args) => {
  try {
    return await fn(...args)
  } catch (e) {
    await captureException(e)
    throw e
  }
}

但是,由于类型变得越来越复杂,所以varargs并不完全具有功能。让您的功能仅在一元fn上正常工作。

  

绑定更多的HoF应该比包装上前的fn更为简单。

您在这里不做任何链接或功能组合。甚至没有意义。

与简单地在目标上调用高阶函数相比,它确实没有任何简单的方法。