0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: javascript, js, функции, javascript-библиотека, частичное применение функций, карринг</p>
1
<p>Теги: javascript, js, функции, javascript-библиотека, частичное применение функций, карринг</p>
2
<p><strong>Частичное применение функций</strong>- один из лучших механизмов, когда-либо созданных для совместного использования кода. Он позволяет внедрять зависимости в код, не прибегая ко всем типичным ООП-шаблонам.</p>
2
<p><strong>Частичное применение функций</strong>- один из лучших механизмов, когда-либо созданных для совместного использования кода. Он позволяет внедрять зависимости в код, не прибегая ко всем типичным ООП-шаблонам.</p>
3
<p>В нашем примере мы будем оборачивать библиотеку<strong>Axios</strong>. Это печально известная библиотека, а известна она тем, что выдаёт исключения вместо того, чтобы возвращать ошибочный ответ. С подобными библиотеками работать довольно сложно, особенно применяя<strong>async/await</strong>.</p>
3
<p>В нашем примере мы будем оборачивать библиотеку<strong>Axios</strong>. Это печально известная библиотека, а известна она тем, что выдаёт исключения вместо того, чтобы возвращать ошибочный ответ. С подобными библиотеками работать довольно сложно, особенно применяя<strong>async/await</strong>.</p>
4
<p>Чтобы сделать безопасной небезопасную функцию, нам пригодится<a>карринг</a>и частичное использование функций:</p>
4
<p>Чтобы сделать безопасной небезопасную функцию, нам пригодится<a>карринг</a>и частичное использование функций:</p>
5
// Оборачиваем 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' });<p>Посмотрите, что функцию<strong>safeApiCall</strong>мы записываем как func = (params) => (data) => {...}. Это техника распространена в функциональном программировании и именно её называют<strong>карринг</strong>. И именно она идёт рука об руку вместе с частичным применением функций. Что это значит? То, что функция func при вызове с params возвратит другую функцию, которая по факту и выполняет работу. Иначе говоря, функция частично используется с params.</p>
5
// Оборачиваем 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' });<p>Посмотрите, что функцию<strong>safeApiCall</strong>мы записываем как func = (params) => (data) => {...}. Это техника распространена в функциональном программировании и именно её называют<strong>карринг</strong>. И именно она идёт рука об руку вместе с частичным применением функций. Что это значит? То, что функция func при вызове с params возвратит другую функцию, которая по факту и выполняет работу. Иначе говоря, функция частично используется с params.</p>
6
<p>Мы можем записать это следующим образом:</p>
6
<p>Мы можем записать это следующим образом:</p>
7
const func = (params) => ( (data) => {...} );<p>Посмотрите, что зависимости (params) передаются в качестве первого параметра, а фактические данные передаются в качестве второго параметра.</p>
7
const func = (params) => ( (data) => {...} );<p>Посмотрите, что зависимости (params) передаются в качестве первого параметра, а фактические данные передаются в качестве второго параметра.</p>
8
<p>Если требуется упрощение задачи, допускается применение npm-пакета saferr, который тоже способен работает с промисами и async/await:</p>
8
<p>Если требуется упрощение задачи, допускается применение npm-пакета saferr, который тоже способен работает с промисами и async/await:</p>
9
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");<p><a>Источник</a></p>
9
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");<p><a>Источник</a></p>
10
10