【问题标题】:composing (?) high order functions with javascript用javascript编写(?)高阶函数
【发布时间】: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)

这可能吗?我要找什么方法?

【问题讨论】:

标签: javascript functional-programming ramda.js


【解决方案1】:

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

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

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

然而,可变参数并不是完全可用的,因为类型变得越来越复杂。让你的函数只在一元 fns 上工作很好。

链接更多的 HoF 应该比包装以前的 fn 更简单,就像现在正在发生的那样。

您在这里没有进行任何链接或函数组合。它甚至是免费的。

这真的没有比简单地调用目标上的高阶函数更简单的了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多