【发布时间】:2019-10-09 01:13:45
【问题描述】:
我正在使用高阶函数来隔离一些不应该存在于我的主处理函数逻辑中的逻辑,这很好用,但它变得有点丑陋并且难以保持链接,我也不知道如何处理数量:
export const handler = sqsEvent(tryCaptureThrow(myHandler))
在这个例子中,我有 2 个 HoF:sqsEvent 和 tryCaptureThrow,它们都接收一个 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)
这可能吗?我要找什么方法?
【问题讨论】:
-
我现在没有时间调查,但请查看
R.pipeWith或R.composeWith。他们可能会有所帮助。
标签: javascript functional-programming ramda.js