【问题标题】:How can I reuse function chains in Javascript?如何在 Javascript 中重用函数链?
【发布时间】:2019-04-30 20:01:42
【问题描述】:

我正在使用函数库 (Gremlin) 来查询图形数据库。调用它看起来像这样:

g.V().has(...).out(...).hasLabel(...).in(...).next();

我的一些功能链很长,我希望能够将其中的一部分重复用于 DRY 目的。例如:

const postProjection = () => (
  project("id", "title")
  .by(__.id())
  .by("title")
)

g.V().hasLabel("post").postProjection().next()

我知道这行不通,但这就是概念。我想将这个链的一部分封装成一个函数,我可以(以某种方式)在需要的地方从这个库中注入各种其他函数链。通过使用可重用段动态构建这些调用,我可以显着减少重复。

这样可以吗?

【问题讨论】:

    标签: javascript functional-programming gremlin


    【解决方案1】:

    如果您想使用您的确切语法调用它,您必须使用类似this answer 的东西将函数添加到Vertex(或其他)原型。不过,这有点冗长,并不是解决此类问题的预期方法。我建议将其设为常规函数调用,除了需要参数之外,您现有的解决方案非常接近:

    const postProjection = (vs) => (
      vs
      .project("id", "title")
      .by(__.id())
      .by("title")
    )
    
    const vs = g.V().hasLabel("post")
    postProjection(vs).next()
    

    【讨论】:

      【解决方案2】:

      也许您可以使用实现函子并让您调用内部对象的方法的类型:

      const foo = i => (console.log(i), {foo, i});
      
      const Box = o => ({
        map: f => Box(f(o)),
        run: (k, ...args) => Box(o[k] (...args)),
        get: o
      });
      
      const fun1 = o =>
        o.foo(3).foo(4)
      
      const fun2 = o =>
        o.foo(7).foo(8);
      
      console.log(
        Box(foo(1).foo(2))
          .map(fun1) // lift normal function into the type
          .run("foo", 5)
          .run("foo", 6)
          .map(fun2)
          .run("foo", 9)
          .get // escape from the type
          .foo(10));

      【讨论】:

        猜你喜欢
        • 2014-08-02
        • 2021-03-14
        • 2013-08-17
        • 2012-06-07
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        • 2011-12-05
        相关资源
        最近更新 更多