zoukankan      html  css  js  c++  java
  • [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
        )
      })
    )
  • 相关阅读:
    SqlServer为字段创建索引
    学习java时在要求输出的数字带俩个小数点时,利用String.format时出现的问题
    JAVA字符串格式化-String.format()的使用
    Java中使用JSONTokener判断接口返回字符串是JSONObject还是JSONArray
    StringUtils工具类中的isBlank()方法和isEmpty()方法的区别
    Idea 隐藏不必要的文件或文件夹 eg:(.idea,.gitignore,*.iml)
    使用Gradle构建android应用
    Android开源库--SlidingMenu左右侧滑菜单
    cmd.exe-应用程序错误 应用程序无法正常启动(0xc0000142)
    Cocos2d-x 开发手记
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10585923.html
Copyright © 2011-2022 走看看