Как мне прочитать эту функцию с несколькими параметрами - PullRequest
0 голосов
/ 09 апреля 2019

Как прочитать и интерпретировать следующую строку функции:

const canUser = (permission) => (permissions) => (guideSlug) => {

Это полная функция:

const canUser = (permission) => (permissions) => (guideSlug) => {
  if (!permissions) return false;

  const globalPermissions = permissions['*'] || {};
  const guidePermissions = permissions[guideSlug] || {};
  return globalPermissions[permission] || guidePermissions[permission] || false;
};

Редактировать

Если у меня есть такой объект:

export const checks = {
  canInvite: canUser('invite'),
}

Я импортирую canInvite в свой компонент, а затем запускаю эту функцию, давая ему guideSlug (строка), чтобы запустить функцию.Это работает и проверяет, я просто не совсем уверен, как понять, что это делает из определения функции const canUser

Любая ясность здесь будет полезна.Спасибо!

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

const foo = function(x) { return x + 1 } можно свободно записать как const foo = x => x + 1. Последний называется функция стрелки

Итак

const canUser = (permission) => (permissions) => (guideSlug) => {
  if (!permissions) return false;

  const globalPermissions = permissions['*'] || {};
  const guidePermissions = permissions[guideSlug] || {};
  return globalPermissions[permission] || guidePermissions[permission] || false;
};

совпадает с

const canUser = function(permission) {
  return function(permissions) {
    return function (guideSlug) {
      if (!permissions) return false;

      const globalPermissions = permissions['*'] || {};
      const guidePermissions = permissions[guideSlug] || {};
      return globalPermissions[permission] || guidePermissions[permission] || false;
    }
  }
};

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

Вот случай, когда это полезно ...

const foo = (x, y) => { /* something to be done with x and y */ }
let x = foo(a,b);
let y = foo(a,c);
let z = foo(a,d);

Здесь, как вы можете видеть, в коде много a s, которые являются несколько повторяющимися и менее читаемыми. Запись его следующим образом решает проблему ...

const foo = x => y => { /* something to be done with x and y */ }
let fooA = foo(a); // fooA is the `y => {}` function with `x = a` "partially applied"
let x = fooA(b);
let y = fooA(c);
let z = foo(a)(d); // you can still write it like this

Еще одним преимуществом такого шаблона является то, что вы можете передавать fooA другой функции или, если хотите сохранить ее в абстракции a, например const somethingRelevantToA = { foo: foo(a), bar: "some other prop of a " }.

Также вы повторно используете логику, если хотите что-то вроде fooA и fooB, и у них есть что-то общее, например ...

const foo = x => y => {
  /* piece of code independent of x (this is being reused) */
  /* piece of code dependent only on y or x and y both */
}

Таким образом, вместо написания fooA и fooB отдельно вы пишете foo и, таким образом, повторно используете логику.

0 голосов
/ 09 апреля 2019

Этот фрагмент кода можно переписать в ES5 следующим образом:

var canUser = function canUser(permission) {
  return function (permissions) {
    return function (guideSlug) {
      if (!permissions) return false;
      var globalPermissions = permissions['*'] || {};
      var guidePermissions = permissions[guideSlug] || {};
      return globalPermissions[permission] || guidePermissions[permission] || false;
    };
  };
};

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

Предполагая, что у вас есть права доступа и руководство где-то определено,

var permissions = {'accounts':{'invite': true}, '*':{'home': '/'}};
var guideSlug = 'accounts';

Вы можете вызвать функцию с помощью:

canUser('invite')(permissions)(guideSlug)

var permissions = {'accounts':{'invite': true}, '*':{'home': '/'}};
var guideSlug = 'accounts';

var canUser = function(permission) {
  return function(permissions) {
    return function (guideSlug) {
      if (!permissions) return false;

      var globalPermissions = permissions['*'] || {};
      var guidePermissions = permissions[guideSlug] || {};
		console.log(globalPermissions);
console.log(guidePermissions);
      return globalPermissions[permission] || guidePermissions[permission] || false;
    }
  }
};

console.log(canUser('invite')(permissions)(guideSlug));

Одна вещь, которую я заметил в вашем примере, заключается в том, что она вызывает только первую функцию, что означает, что она вернет функцию обратно в check.canInvite, когда вы вызовете ее здесь:

export const checks = {
  canInvite: canUser('invite'),
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...