Я использую функции высокого порядка, чтобы изолировать некоторую логику, которая не должна соответствовать моей логике функций основного обработчика, это хорошо работает, но становится немного уродливым и трудно продолжать цепочку, я также не уверен, как ручка arity:
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)
Это возможно? Какой метод я ищу?