Что это такое, как их использовать и практический пример использования.

Кто они такие?

Функции карри не являются функциями с азиатскими пряностями. Я люблю курицу с карри и многое другое, но, увы, мы говорим не об этом.

Каррирование функции звучит сложно, но на практике это довольно просто. Начните с написания базовой функции JavaScript (используя синтаксис ES6);

const addThree = (number) => {
    return a + 3;
};
addThree(4);   // => 7

Что, если нам нужна функция, добавляющая четыре, а не три? Может быть, мы создадим еще одну функцию addFour и сделаем что-то подобное.

const addFour = (number) => {
    return a + 4;
};
addFour(5);   // => 9

Тем не менее, мы разработчики программного обеспечения; простота, удобочитаемость и принцип «работать умнее, а не усерднее» всегда должны быть целью. Мы не зря занимаемся инженерами. Сама наша работа заключается в автоматизации и решении проблем с помощью программного обеспечения.

Вот где подходят каррированные функции. В одной функции вы можете создать две функции, которые могут addFour И addThree. Вот как.

const add = (amount) => (number) => {
    return number + amount;
};
const addThree = add(3);
const addFour = add(4);
addThree(3); // => 6
addFour(8); // => 12

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

const add = (amount) => {
    return (number) => {
        return number + amount;
    }
};

Вы видите абстракцию? Возможности? Теперь, если вам нужно больше функций, может быть, addFive или addSix, вам не нужно создавать новые функции, вы можете просто сделать:

const addFive = add(5);
const addSix = add(6);

Вам может быть интересно, почему бы вам просто не сделать const add = (amount, number) => .... Правильный вопрос.

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

Вариант использования

Недавно я создал приложение для форума жалоб, чтобы опробовать новый стек технологий, который меня интересовал: Svelte + Tailwind + Airtable (как БД) + AWS S3 (чисто статический).

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

const baseUrl = "https://api.airtable.com/v0/<airtable-project-key>"
const createFetcher = table => async ({
  method = 'GET',
  params = '',
  id = '',
  data = {}
} = {}) => {
  const extras = {
    headers: {
      'Authorization': 'Bearer <airtable-api-key>',
      'Content-Type': 'application/json',
    },
    method,
  };
  if (method !== 'GET') {
    extras.body = JSON.stringify(data)
  }
  if (!!params) {
    params = Object.keys(params).map(function(key) {
      return key + '=' + params[key];
    }).join('&');
  }
  const res = await fetch(baseUrl + `/${table}${id ? '/' + id : ''}?` + params, extras)
  return res.json()
}
export const Complaints = createFetcher('Complaints')
export const Comments = createFetcher('Comments')
export const Threads = createFetcher('Threads')
export const Users = createFetcher('Users')

Авария

createFetcher — это каррированная функция, которая позволяет вам создавать оболочку вокруг каждой таблицы без необходимости выполнять всю работу по выборке шаблонов. Затем внизу я создаю функцию извлечения для каждой таблицы.

Применение

Чтобы удалить тему.. или комментарий.

Threads({
    method: 'DELETE',
    id: threadId
});
Comments({
    method: 'DELETE',
    id: commentId
});

И вот оно. Нужно удалить жалобу? Вы знаете, что делать.

Привет, Брайант Брок.