Как я могу повторно использовать цепочки функций в Javascript? - PullRequest
3 голосов
/ 30 апреля 2019

Я использую функциональную библиотеку ( Gremlin ) для запроса базы данных графа. Вызывая это выглядит так:

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

Некоторые из моих функциональных цепочек очень длинные, и я хотел бы иметь возможность повторно использовать их в СУХОХ целях. Например:

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

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

Я знаю, что это не работает, но это концепция. Я хочу инкапсулировать часть этой цепочки в функцию, которую я могу (как-то) внедрить в различные другие цепочки функций из этой библиотеки, где это необходимо. Динамически создавая эти вызовы с повторно используемыми сегментами, я мог бы значительно сократить количество повторений.

Возможно ли это сделать?

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Если вы хотите вызвать его, используя точный синтаксис, вам нужно будет добавить функции к Vertex (или какому-либо другому) прототипу, используя что-то вроде этот ответ . Это довольно многословно, но не совсем ожидаемый способ решить что-то подобное. Я бы рекомендовал сделать это обычным вызовом функции, для которого ваше существующее решение довольно близко, за исключением необходимости параметра:

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

const vs = g.V().hasLabel("post")
postProjection(vs).next()
0 голосов
/ 01 мая 2019

Возможно, вы можете использовать тип, который реализует функтор и позволяет вызывать методы внутреннего объекта:

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));
...