[Functional Programming] Create Reusable Functions with Partial Application in JavaScript
This lesson teaches you how arguments passed to a curried function allow us to store data in closure to be reused in our programs and applications. Since each argument, except for the final one, returns a new function, we can easily create reusable functions by supplying some of these arguments beforehand, and sharing these partially applied functions with other parts of our codebase. In this lesson, we'll create a curried function to fetch requests from an API that uses partial application to create reusable functionality.
Another way to do partially API call is using Proxy. Check this out.
// Partial Application // Curried functions create a wonderful emergent property, "partial application", // that is useful for building up reusability in our applications that you // just can't get with normal, multivariate functions. Because curried functions // return a new function with each argument (except for the final one), we are // able to "partially apply" values and store them in closure, available to any // subsequent function, thus creating new, reusable functions with some values // already supplied. // Imagine we have an application that needs to make requests to different APIs. // We can create a function that bakes in the base URL, while allowing other // arguments to be passed in later const fetch = require('node-fetch') const getFromAPI = baseURL => endPoint => callback => fetch(`${baseURL}${endPoint}`) .then(res => res.json()) .then(data => callback(data)) .catch(err => { console.error(err.message) }) // Now we can partially apply a baseURL to create a reusable function for // one of our APIs const getGithub = getFromAPI( 'https://api.github.com' ) // We can create several get request functions by partially applying different // endpoints to our getGithub function const getGithubUsers = getGithub('/users') const getGithubRepos = getGithub('/repositories') // Now we can use our callback to get the data and do something with it. getGithubUsers(data => data.forEach(user => { console.log(`User: ${user.login}`) }) ) getGithubRepos(data => data.forEach(repo => { console.log(`Repo: ${repo.name}`) }) ) // We can still continue to reuse previous partially applied functions const getGithubOrgs = getGithub('/organizations') getGithubOrgs(data => data.forEach(org => { console.log(`Org: ${org.login}`) }) ) // We can start the process all over by partially applying a new baseURL const getReddit = getFromAPI('https://reddit.com') // And let's get some pictures of some cute animals const getRedditAww = getReddit('/r/aww.json') // And fetch the URLs of those images const imageURLs = getRedditAww(payload => payload.data.children.forEach(child => { console.log( child.data.preview.images[0].source.url ) }) )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-03-23 [Angular] Angular CLI
2017-03-23 [React Router v4] Intercept Route Changes
2017-03-23 [React Router v4] Redirect to Another Page
2016-03-23 [Angular 2] Filter items with a custom search Pipe in Angular 2
2016-03-23 [Angular 2] Transclusion in Angular 2
2015-03-23 [React] React Fundamentals: First Component