Частичное применение функций в JavaScript | OTUS
⚡ Открываем подписку на курсы!
Проходите параллельно 3 онлайн-курса в месяц по цене одного.
Подробнее

Курсы

Программирование
Flutter Mobile Developer Подготовка к сертификации Oracle Java Programmer (OCAJP)
-8%
Алгоритмы и структуры данных
-12%
Web-разработчик на Python
-11%
Архитектура и шаблоны проектирования
-14%
JavaScript Developer. Basic Супер-интенсив «СУБД в высоконагруженных системах»
-18%
iOS-разработчик. Базовый курс
-23%
Разработчик на Spring Framework
-23%
Python Developer. Basic
-16%
C# ASP.NET Core разработчик
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Android Developer. Basic
-10%
C++ Developer. Professional Разработчик C# AWS для разработчиков Software Architect Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов Backend-разработка на Kotlin React.js Developer Разработчик Node.js Нереляционные базы данных Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Advanced Fullstack JavaScript developer
Инфраструктура
PostgreSQL
-10%
IoT-разработчик
-12%
Administrator Linux. Professional
-11%
Базы данных
-19%
Administrator Linux.Basic
-18%
Супер-интенсив «СУБД в высоконагруженных системах»
-18%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-6%
Сетевой инженер AWS для разработчиков Software Architect Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Частичное применение функций в JavaScript

otus_Posts_25may_VK_1000x700_1-5020-980880.jpg

Частичное применение функций — один из лучших механизмов, когда-либо созданных для совместного использования кода. Он позволяет внедрять зависимости в код, не прибегая ко всем типичным ООП-шаблонам.

В нашем примере мы будем оборачивать библиотеку Axios. Это печально известная библиотека, а известна она тем, что выдаёт исключения вместо того, чтобы возвращать ошибочный ответ. С подобными библиотеками работать довольно сложно, особенно применяя async/await.

Чтобы сделать безопасной небезопасную функцию, нам пригодится карринг и частичное использование функций:

// Оборачиваем axios, чтобы обеспечить безопасный вызов api без отбрасывания исключений
const safeApiCall = ({ url, method }) => data =>
  axios({ url, method, data })
    .then( result => ([null, result]) ) 
    .catch( error => ([error, null]) );

// Частично применяем общую функцию выше, чтобы работать с пользовательским API
const createUser = safeApiCall({
    url: '/api/users',
    method: 'post'
  });

// Теперь безопасно вызываем API и не беспокоимся об исключениях
const [error, user] = await createUser({
  email: 'ilya@suzdalnitski.com',
  password: 'Password'
});

Посмотрите, что функцию safeApiCall мы записываем как func = (params) => (data) => {...}. Это техника распространена в функциональном программировании и именно её называют карринг. И именно она идёт рука об руку вместе с частичным применением функций. Что это значит? То, что функция func при вызове с params возвратит другую функцию, которая по факту и выполняет работу. Иначе говоря, функция частично используется с params.

Мы можем записать это следующим образом:

const func = (params) => (
   (data) => {...}
);

Посмотрите, что зависимости (params) передаются в качестве первого параметра, а фактические данные передаются в качестве второго параметра.

Если требуется упрощение задачи, допускается применение npm-пакета saferr, который тоже способен работает с промисами и async/await:

import saferr from "saferr";
import axios from "axios";

const safeGet = saferr(axios.get);

const testAsync = async url => {
  const [err, result] = await safeGet(url);

  if (err) {
    console.error(err.message);
    return;
  }

  console.log(result.data.results[0].email);
};


// Вывод: zdenka.dieckmann@example.com
testAsync("https://randomuser.me/api/?results=1");

// Вывод: Network Error
testAsync("https://shmoogle.com");

Источник

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться