составление (?) функций высокого порядка с помощью JavaScript - PullRequest
0 голосов
/ 22 мая 2019

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

Это возможно? Какой метод я ищу?

1 Ответ

0 голосов
/ 22 мая 2019

Количество аргументов, которое принимает fn, должно быть неявным - в настоящее время кодируется как один, определенный как whatever

Для этого можно использовать параметры отдыха и синтаксис расширения:

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

Однако varargs не полностью функциональны, так как с ними типы становятся все сложнее. Работать только с одинарными fn s - нормально.

Цепочка большего количества HoF должна быть проще, чем завершение предыдущего fn, как это происходит в настоящее время.

Вы не делаете здесь никакой цепочки или композиции функций. Это даже бессмысленно.

Это действительно не проще, чем простой вызов функций высшего порядка для цели.

...