HTML Diff
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 }) =&gt; data =&gt; axios({ url, method, data }) .then( result =&gt; ([null, result]) ) .catch( error =&gt; ([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) =&gt; (data) =&gt; {...}. Это техника распространена в функциональном программировании и именно её называют<strong>карринг</strong>. И именно она идёт рука об руку вместе с частичным применением функций. Что это значит? То, что функция func при вызове с params возвратит другую функцию, которая по факту и выполняет работу. Иначе говоря, функция частично используется с params.</p>
5 // Оборачиваем axios, чтобы обеспечить безопасный вызов api без отбрасывания исключений const safeApiCall = ({ url, method }) =&gt; data =&gt; axios({ url, method, data }) .then( result =&gt; ([null, result]) ) .catch( error =&gt; ([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) =&gt; (data) =&gt; {...}. Это техника распространена в функциональном программировании и именно её называют<strong>карринг</strong>. И именно она идёт рука об руку вместе с частичным применением функций. Что это значит? То, что функция func при вызове с params возвратит другую функцию, которая по факту и выполняет работу. Иначе говоря, функция частично используется с params.</p>
6 <p>Мы можем записать это следующим образом:</p>
6 <p>Мы можем записать это следующим образом:</p>
7 const func = (params) =&gt; ( (data) =&gt; {...} );<p>Посмотрите, что зависимости (params) передаются в качестве первого параметра, а фактические данные передаются в качестве второго параметра.</p>
7 const func = (params) =&gt; ( (data) =&gt; {...} );<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 =&gt; { 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 =&gt; { 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